annotate src/event/quic/ngx_event_quic_migration.c @ 9153:8f7e6d8c061e

QUIC: use last client dcid to receive initial packets. Previously, original dcid was used to receive initial client packets in case server initial response was lost. However, last dcid should be used instead. These two are the same unless retry is used. In case of retry, client resends initial packet with a new dcid, that is different from the original dcid. If server response is lost, the client resends this packet again with the same dcid. This is shown in RFC 9000, 7.3. Authenticating Connection IDs, Figure 8. The issue manifested itself with creating multiple server sessions in response to each post-retry client initial packet, if server response is lost.
author Roman Arutyunyan <arut@nginx.com>
date Wed, 30 Aug 2023 11:09:21 +0400
parents 58afcd72446f
children f6b6f3dd7ca0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8737
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
2 /*
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
3 * Copyright (C) Nginx, Inc.
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
4 */
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
5
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
6
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
7 #include <ngx_config.h>
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
8 #include <ngx_core.h>
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
9 #include <ngx_event.h>
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
10 #include <ngx_event_quic_connection.h>
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
11
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
12
9147
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
13 #define NGX_QUIC_PATH_MTU_DELAY 100
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
14 #define NGX_QUIC_PATH_MTU_PRECISION 16
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
15
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
16
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
17 static void ngx_quic_set_connection_path(ngx_connection_t *c,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
18 ngx_quic_path_t *path);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
19 static ngx_int_t ngx_quic_validate_path(ngx_connection_t *c,
8944
b7284807b4fa QUIC: refactored ngx_quic_validate_path().
Vladimir Homutov <vl@nginx.com>
parents: 8943
diff changeset
20 ngx_quic_path_t *path);
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
21 static ngx_int_t ngx_quic_send_path_challenge(ngx_connection_t *c,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
22 ngx_quic_path_t *path);
9098
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
23 static void ngx_quic_set_path_timer(ngx_connection_t *c);
9147
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
24 static ngx_int_t ngx_quic_expire_path_validation(ngx_connection_t *c,
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
25 ngx_quic_path_t *path);
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
26 static ngx_int_t ngx_quic_expire_path_mtu_delay(ngx_connection_t *c,
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
27 ngx_quic_path_t *path);
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
28 static ngx_int_t ngx_quic_expire_path_mtu_discovery(ngx_connection_t *c,
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
29 ngx_quic_path_t *path);
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
30 static ngx_quic_path_t *ngx_quic_get_path(ngx_connection_t *c, ngx_uint_t tag);
9147
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
31 static ngx_int_t ngx_quic_send_path_mtu_probe(ngx_connection_t *c,
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
32 ngx_quic_path_t *path);
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
33
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
34
8737
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
35 ngx_int_t
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
36 ngx_quic_handle_path_challenge_frame(ngx_connection_t *c,
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
37 ngx_quic_header_t *pkt, ngx_quic_path_challenge_frame_t *f)
8737
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
38 {
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
39 ngx_quic_frame_t frame, *fp;
8737
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
40 ngx_quic_connection_t *qc;
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
41
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
42 qc = ngx_quic_get_connection(c);
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
43
8933
02a9ad88e2df QUIC: added missing frame initialization.
Vladimir Homutov <vl@nginx.com>
parents: 8932
diff changeset
44 ngx_memzero(&frame, sizeof(ngx_quic_frame_t));
02a9ad88e2df QUIC: added missing frame initialization.
Vladimir Homutov <vl@nginx.com>
parents: 8932
diff changeset
45
8778
5186ee5a94b9 QUIC: simplified sending 1-RTT only frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8777
diff changeset
46 frame.level = ssl_encryption_application;
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
47 frame.type = NGX_QUIC_FT_PATH_RESPONSE;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
48 frame.u.path_response = *f;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
49
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
50 /*
8797
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8778
diff changeset
51 * RFC 9000, 8.2.2. Path Validation Responses
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8778
diff changeset
52 *
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
53 * A PATH_RESPONSE frame MUST be sent on the network path where the
8797
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8778
diff changeset
54 * PATH_CHALLENGE frame was received.
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
55 */
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
56
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
57 /*
8901
a951e0809044 QUIC: fixed PATH_RESPONSE frame expansion.
Vladimir Homutov <vl@nginx.com>
parents: 8822
diff changeset
58 * An endpoint MUST expand datagrams that contain a PATH_RESPONSE frame
a951e0809044 QUIC: fixed PATH_RESPONSE frame expansion.
Vladimir Homutov <vl@nginx.com>
parents: 8822
diff changeset
59 * to at least the smallest allowed maximum datagram size of 1200 bytes.
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
60 */
9146
f3412ec3b6d1 QUIC: allowed ngx_quic_frame_sendto() to return NGX_AGAIN.
Roman Arutyunyan <arut@nginx.com>
parents: 9144
diff changeset
61 if (ngx_quic_frame_sendto(c, &frame, 1200, pkt->path) == NGX_ERROR) {
8737
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
62 return NGX_ERROR;
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
63 }
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
64
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
65 if (pkt->path == qc->path) {
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
66 /*
8797
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8778
diff changeset
67 * RFC 9000, 9.3.3. Off-Path Packet Forwarding
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8778
diff changeset
68 *
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
69 * An endpoint that receives a PATH_CHALLENGE on an active path SHOULD
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
70 * send a non-probing packet in response.
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
71 */
8737
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
72
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
73 fp = ngx_quic_alloc_frame(c);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
74 if (fp == NULL) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
75 return NGX_ERROR;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
76 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
77
8778
5186ee5a94b9 QUIC: simplified sending 1-RTT only frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8777
diff changeset
78 fp->level = ssl_encryption_application;
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
79 fp->type = NGX_QUIC_FT_PING;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
80
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
81 ngx_quic_queue_frame(qc, fp);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
82 }
8737
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
83
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
84 return NGX_OK;
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
85 }
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
86
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
87
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
88 ngx_int_t
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
89 ngx_quic_handle_path_response_frame(ngx_connection_t *c,
8778
5186ee5a94b9 QUIC: simplified sending 1-RTT only frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8777
diff changeset
90 ngx_quic_path_challenge_frame_t *f)
8737
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
91 {
8943
118a34e32121 QUIC: added missing check for backup path existence.
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
92 ngx_uint_t rst;
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
93 ngx_queue_t *q;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
94 ngx_quic_path_t *path, *prev;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
95 ngx_quic_connection_t *qc;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
96
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
97 qc = ngx_quic_get_connection(c);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
98
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
99 /*
8797
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8778
diff changeset
100 * RFC 9000, 8.2.3. Successful Path Validation
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8778
diff changeset
101 *
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
102 * A PATH_RESPONSE frame received on any network path validates the path
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
103 * on which the PATH_CHALLENGE was sent.
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
104 */
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
105
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
106 for (q = ngx_queue_head(&qc->paths);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
107 q != ngx_queue_sentinel(&qc->paths);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
108 q = ngx_queue_next(q))
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
109 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
110 path = ngx_queue_data(q, ngx_quic_path_t, queue);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
111
9147
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
112 if (path->state != NGX_QUIC_PATH_VALIDATING) {
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
113 continue;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
114 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
115
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
116 if (ngx_memcmp(path->challenge1, f->data, sizeof(f->data)) == 0
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
117 || ngx_memcmp(path->challenge2, f->data, sizeof(f->data)) == 0)
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
118 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
119 goto valid;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
120 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
121 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
122
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
123 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
9015
a2fbae359828 QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8997
diff changeset
124 "quic stale PATH_RESPONSE ignored");
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
125
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
126 return NGX_OK;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
127
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
128 valid:
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
129
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
130 /*
8797
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8778
diff changeset
131 * RFC 9000, 9.4. Loss Detection and Congestion Control
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8778
diff changeset
132 *
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
133 * On confirming a peer's ownership of its new address,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
134 * an endpoint MUST immediately reset the congestion controller
8797
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8778
diff changeset
135 * and round-trip time estimator for the new path to initial values
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8778
diff changeset
136 * unless the only change in the peer's address is its port number.
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
137 */
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
138
8943
118a34e32121 QUIC: added missing check for backup path existence.
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
139 rst = 1;
118a34e32121 QUIC: added missing check for backup path existence.
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
140
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
141 prev = ngx_quic_get_path(c, NGX_QUIC_PATH_BACKUP);
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
142
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
143 if (prev != NULL) {
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
144
8943
118a34e32121 QUIC: added missing check for backup path existence.
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
145 if (ngx_cmp_sockaddr(prev->sockaddr, prev->socklen,
118a34e32121 QUIC: added missing check for backup path existence.
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
146 path->sockaddr, path->socklen, 0)
118a34e32121 QUIC: added missing check for backup path existence.
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
147 == NGX_OK)
118a34e32121 QUIC: added missing check for backup path existence.
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
148 {
118a34e32121 QUIC: added missing check for backup path existence.
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
149 /* address did not change */
118a34e32121 QUIC: added missing check for backup path existence.
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
150 rst = 0;
9147
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
151
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
152 path->mtu = prev->mtu;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
153 path->max_mtu = prev->max_mtu;
8943
118a34e32121 QUIC: added missing check for backup path existence.
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
154 }
118a34e32121 QUIC: added missing check for backup path existence.
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
155 }
118a34e32121 QUIC: added missing check for backup path existence.
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
156
118a34e32121 QUIC: added missing check for backup path existence.
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
157 if (rst) {
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
158 ngx_memzero(&qc->congestion, sizeof(ngx_quic_congestion_t));
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
159
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
160 qc->congestion.window = ngx_min(10 * qc->tp.max_udp_payload_size,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
161 ngx_max(2 * qc->tp.max_udp_payload_size,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
162 14720));
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
163 qc->congestion.ssthresh = (size_t) -1;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
164 qc->congestion.recovery_start = ngx_current_msec;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
165 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
166
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
167 /*
8797
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8778
diff changeset
168 * RFC 9000, 9.3. Responding to Connection Migration
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8778
diff changeset
169 *
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
170 * After verifying a new client address, the server SHOULD
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
171 * send new address validation tokens (Section 8) to the client.
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
172 */
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
173
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
174 if (ngx_quic_send_new_token(c, path) != NGX_OK) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
175 return NGX_ERROR;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
176 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
177
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
178 ngx_log_error(NGX_LOG_INFO, c->log, 0,
8997
fab36e4abf83 QUIC: got rid of hash symbol in backup and logging.
Vladimir Homutov <vl@nginx.com>
parents: 8985
diff changeset
179 "quic path seq:%uL addr:%V successfully validated",
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
180 path->seqnum, &path->addr_text);
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
181
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
182 ngx_quic_path_dbg(c, "is validated", path);
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
183
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
184 path->validated = 1;
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
185
9147
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
186 ngx_quic_discover_path_mtu(c, path);
9098
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
187
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
188 return NGX_OK;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
189 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
190
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
191
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
192 ngx_quic_path_t *
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
193 ngx_quic_new_path(ngx_connection_t *c,
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
194 struct sockaddr *sockaddr, socklen_t socklen, ngx_quic_client_id_t *cid)
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
195 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
196 ngx_queue_t *q;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
197 ngx_quic_path_t *path;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
198 ngx_quic_connection_t *qc;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
199
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
200 qc = ngx_quic_get_connection(c);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
201
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
202 if (!ngx_queue_empty(&qc->free_paths)) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
203
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
204 q = ngx_queue_head(&qc->free_paths);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
205 path = ngx_queue_data(q, ngx_quic_path_t, queue);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
206
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
207 ngx_queue_remove(&path->queue);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
208
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
209 ngx_memzero(path, sizeof(ngx_quic_path_t));
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
210
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
211 } else {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
212
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
213 path = ngx_pcalloc(c->pool, sizeof(ngx_quic_path_t));
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
214 if (path == NULL) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
215 return NULL;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
216 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
217 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
218
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
219 ngx_queue_insert_tail(&qc->paths, &path->queue);
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
220
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
221 path->cid = cid;
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
222 cid->used = 1;
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
223
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
224 path->seqnum = qc->path_seqnum++;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
225
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
226 path->sockaddr = &path->sa.sockaddr;
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
227 path->socklen = socklen;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
228 ngx_memcpy(path->sockaddr, sockaddr, socklen);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
229
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
230 path->addr_text.data = path->text;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
231 path->addr_text.len = ngx_sock_ntop(sockaddr, socklen, path->text,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
232 NGX_SOCKADDR_STRLEN, 1);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
233
9147
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
234 path->mtu = NGX_QUIC_MIN_INITIAL_SIZE;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
235
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
236 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
8997
fab36e4abf83 QUIC: got rid of hash symbol in backup and logging.
Vladimir Homutov <vl@nginx.com>
parents: 8985
diff changeset
237 "quic path seq:%uL created addr:%V",
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
238 path->seqnum, &path->addr_text);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
239 return path;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
240 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
241
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
242
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
243 static ngx_quic_path_t *
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
244 ngx_quic_get_path(ngx_connection_t *c, ngx_uint_t tag)
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
245 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
246 ngx_queue_t *q;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
247 ngx_quic_path_t *path;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
248 ngx_quic_connection_t *qc;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
249
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
250 qc = ngx_quic_get_connection(c);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
251
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
252 for (q = ngx_queue_head(&qc->paths);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
253 q != ngx_queue_sentinel(&qc->paths);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
254 q = ngx_queue_next(q))
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
255 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
256 path = ngx_queue_data(q, ngx_quic_path_t, queue);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
257
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
258 if (path->tag == tag) {
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
259 return path;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
260 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
261 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
262
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
263 return NULL;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
264 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
265
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
266
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
267 ngx_int_t
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
268 ngx_quic_set_path(ngx_connection_t *c, ngx_quic_header_t *pkt)
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
269 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
270 off_t len;
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
271 ngx_queue_t *q;
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
272 ngx_quic_path_t *path, *probe;
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
273 ngx_quic_socket_t *qsock;
8972
077a1e403446 QUIC: additional limit for probing packets.
Vladimir Homutov <vl@nginx.com>
parents: 8971
diff changeset
274 ngx_quic_send_ctx_t *ctx;
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
275 ngx_quic_client_id_t *cid;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
276 ngx_quic_connection_t *qc;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
277
8939
ddd5e5c0f87d QUIC: improved path validation.
Vladimir Homutov <vl@nginx.com>
parents: 8933
diff changeset
278 qc = ngx_quic_get_connection(c);
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
279 qsock = ngx_quic_get_socket(c);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
280
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
281 len = pkt->raw->last - pkt->raw->start;
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
282
9017
c2f5d79cde64 QUIC: separate UDP framework for QUIC.
Roman Arutyunyan <arut@nginx.com>
parents: 9015
diff changeset
283 if (c->udp->buffer == NULL) {
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
284 /* first ever packet in connection, path already exists */
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
285 path = qc->path;
8913
40445fc7c403 QUIC: fixed migration during NAT rebinding.
Vladimir Homutov <vl@nginx.com>
parents: 8912
diff changeset
286 goto update;
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
287 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
288
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
289 probe = NULL;
8777
d5f93733c17d QUIC: relaxed client id requirements.
Vladimir Homutov <vl@nginx.com>
parents: 8763
diff changeset
290
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
291 for (q = ngx_queue_head(&qc->paths);
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
292 q != ngx_queue_sentinel(&qc->paths);
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
293 q = ngx_queue_next(q))
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
294 {
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
295 path = ngx_queue_data(q, ngx_quic_path_t, queue);
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
296
9017
c2f5d79cde64 QUIC: separate UDP framework for QUIC.
Roman Arutyunyan <arut@nginx.com>
parents: 9015
diff changeset
297 if (ngx_cmp_sockaddr(&qsock->sockaddr.sockaddr, qsock->socklen,
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
298 path->sockaddr, path->socklen, 1)
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
299 == NGX_OK)
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
300 {
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
301 goto update;
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
302 }
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
303
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
304 if (path->tag == NGX_QUIC_PATH_PROBE) {
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
305 probe = path;
8777
d5f93733c17d QUIC: relaxed client id requirements.
Vladimir Homutov <vl@nginx.com>
parents: 8763
diff changeset
306 }
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
307 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
308
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
309 /* packet from new path, drop current probe, if any */
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
310
8972
077a1e403446 QUIC: additional limit for probing packets.
Vladimir Homutov <vl@nginx.com>
parents: 8971
diff changeset
311 ctx = ngx_quic_get_send_ctx(qc, pkt->level);
077a1e403446 QUIC: additional limit for probing packets.
Vladimir Homutov <vl@nginx.com>
parents: 8971
diff changeset
312
077a1e403446 QUIC: additional limit for probing packets.
Vladimir Homutov <vl@nginx.com>
parents: 8971
diff changeset
313 /*
077a1e403446 QUIC: additional limit for probing packets.
Vladimir Homutov <vl@nginx.com>
parents: 8971
diff changeset
314 * only accept highest-numbered packets to prevent connection id
077a1e403446 QUIC: additional limit for probing packets.
Vladimir Homutov <vl@nginx.com>
parents: 8971
diff changeset
315 * exhaustion by excessive probing packets from unknown paths
077a1e403446 QUIC: additional limit for probing packets.
Vladimir Homutov <vl@nginx.com>
parents: 8971
diff changeset
316 */
077a1e403446 QUIC: additional limit for probing packets.
Vladimir Homutov <vl@nginx.com>
parents: 8971
diff changeset
317 if (pkt->pn != ctx->largest_pn) {
077a1e403446 QUIC: additional limit for probing packets.
Vladimir Homutov <vl@nginx.com>
parents: 8971
diff changeset
318 return NGX_DONE;
077a1e403446 QUIC: additional limit for probing packets.
Vladimir Homutov <vl@nginx.com>
parents: 8971
diff changeset
319 }
077a1e403446 QUIC: additional limit for probing packets.
Vladimir Homutov <vl@nginx.com>
parents: 8971
diff changeset
320
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
321 if (probe && ngx_quic_free_path(c, probe) != NGX_OK) {
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
322 return NGX_ERROR;
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
323 }
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
324
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
325 /* new path requires new client id */
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
326 cid = ngx_quic_next_client_id(c);
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
327 if (cid == NULL) {
9029
28fc35b71d75 QUIC: "info" logging level on insufficient client connection ids.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9017
diff changeset
328 ngx_log_error(NGX_LOG_INFO, c->log, 0,
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
329 "quic no available client ids for new path");
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
330 /* stop processing of this datagram */
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
331 return NGX_DONE;
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
332 }
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
333
9017
c2f5d79cde64 QUIC: separate UDP framework for QUIC.
Roman Arutyunyan <arut@nginx.com>
parents: 9015
diff changeset
334 path = ngx_quic_new_path(c, &qsock->sockaddr.sockaddr, qsock->socklen, cid);
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
335 if (path == NULL) {
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
336 return NGX_ERROR;
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
337 }
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
338
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
339 path->tag = NGX_QUIC_PATH_PROBE;
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
340
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
341 /*
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
342 * client arrived using new path and previously seen DCID,
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
343 * this indicates NAT rebinding (or bad client)
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
344 */
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
345 if (qsock->used) {
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
346 pkt->rebound = 1;
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
347 }
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
348
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
349 update:
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
350
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
351 qsock->used = 1;
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
352 pkt->path = path;
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
353
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
354 /* TODO: this may be too late in some cases;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
355 * for example, if error happens during decrypt(), we cannot
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
356 * send CC, if error happens in 1st packet, due to amplification
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
357 * limit, because path->received = 0
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
358 *
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
359 * should we account garbage as received or only decrypting packets?
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
360 */
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
361 path->received += len;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
362
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
363 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
8997
fab36e4abf83 QUIC: got rid of hash symbol in backup and logging.
Vladimir Homutov <vl@nginx.com>
parents: 8985
diff changeset
364 "quic packet len:%O via sock seq:%L path seq:%uL",
8985
da24a78720eb QUIC: fixed handling of initial source connection id.
Vladimir Homutov <vl@nginx.com>
parents: 8972
diff changeset
365 len, (int64_t) qsock->sid.seqnum, path->seqnum);
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
366 ngx_quic_path_dbg(c, "status", path);
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
367
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
368 return NGX_OK;
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
369 }
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
370
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
371
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
372 ngx_int_t
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
373 ngx_quic_free_path(ngx_connection_t *c, ngx_quic_path_t *path)
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
374 {
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
375 ngx_quic_connection_t *qc;
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
376
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
377 qc = ngx_quic_get_connection(c);
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
378
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
379 ngx_queue_remove(&path->queue);
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
380 ngx_queue_insert_head(&qc->free_paths, &path->queue);
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
381
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
382 /*
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
383 * invalidate CID that is no longer usable for any other path;
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
384 * this also requests new CIDs from client
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
385 */
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
386 if (path->cid) {
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
387 if (ngx_quic_free_client_id(c, path->cid) != NGX_OK) {
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
388 return NGX_ERROR;
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
389 }
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
390 }
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
391
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
392 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
8997
fab36e4abf83 QUIC: got rid of hash symbol in backup and logging.
Vladimir Homutov <vl@nginx.com>
parents: 8985
diff changeset
393 "quic path seq:%uL addr:%V retired",
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
394 path->seqnum, &path->addr_text);
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
395
8737
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
396 return NGX_OK;
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
397 }
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
398
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
399
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
400 static void
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
401 ngx_quic_set_connection_path(ngx_connection_t *c, ngx_quic_path_t *path)
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
402 {
9015
a2fbae359828 QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8997
diff changeset
403 ngx_memcpy(c->sockaddr, path->sockaddr, path->socklen);
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
404 c->socklen = path->socklen;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
405
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
406 if (c->addr_text.data) {
9099
9462c514a653 QUIC: fixed addr_text after migration (ticket #2488).
Roman Arutyunyan <arut@nginx.com>
parents: 9098
diff changeset
407 c->addr_text.len = ngx_sock_ntop(c->sockaddr, c->socklen,
9462c514a653 QUIC: fixed addr_text after migration (ticket #2488).
Roman Arutyunyan <arut@nginx.com>
parents: 9098
diff changeset
408 c->addr_text.data,
9462c514a653 QUIC: fixed addr_text after migration (ticket #2488).
Roman Arutyunyan <arut@nginx.com>
parents: 9098
diff changeset
409 c->listening->addr_text_max_len, 0);
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
410 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
411
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
412 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
8997
fab36e4abf83 QUIC: got rid of hash symbol in backup and logging.
Vladimir Homutov <vl@nginx.com>
parents: 8985
diff changeset
413 "quic send path set to seq:%uL addr:%V",
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
414 path->seqnum, &path->addr_text);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
415 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
416
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
417
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
418 ngx_int_t
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
419 ngx_quic_handle_migration(ngx_connection_t *c, ngx_quic_header_t *pkt)
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
420 {
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
421 ngx_quic_path_t *next, *bkp;
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
422 ngx_quic_send_ctx_t *ctx;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
423 ngx_quic_connection_t *qc;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
424
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
425 /* got non-probing packet via non-active path */
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
426
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
427 qc = ngx_quic_get_connection(c);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
428
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
429 ctx = ngx_quic_get_send_ctx(qc, pkt->level);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
430
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
431 /*
8797
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8778
diff changeset
432 * RFC 9000, 9.3. Responding to Connection Migration
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8778
diff changeset
433 *
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
434 * An endpoint only changes the address to which it sends packets in
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
435 * response to the highest-numbered non-probing packet.
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
436 */
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
437 if (pkt->pn != ctx->largest_pn) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
438 return NGX_OK;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
439 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
440
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
441 next = pkt->path;
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
442
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
443 /*
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
444 * RFC 9000, 9.3.3:
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
445 *
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
446 * In response to an apparent migration, endpoints MUST validate the
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
447 * previously active path using a PATH_CHALLENGE frame.
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
448 */
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
449 if (pkt->rebound) {
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
450
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
451 /* NAT rebinding: client uses new path with old SID */
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
452 if (ngx_quic_validate_path(c, qc->path) != NGX_OK) {
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
453 return NGX_ERROR;
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
454 }
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
455 }
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
456
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
457 if (qc->path->validated) {
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
458
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
459 if (next->tag != NGX_QUIC_PATH_BACKUP) {
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
460 /* can delete backup path, if any */
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
461 bkp = ngx_quic_get_path(c, NGX_QUIC_PATH_BACKUP);
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
462
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
463 if (bkp && ngx_quic_free_path(c, bkp) != NGX_OK) {
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
464 return NGX_ERROR;
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
465 }
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
466 }
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
467
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
468 qc->path->tag = NGX_QUIC_PATH_BACKUP;
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
469 ngx_quic_path_dbg(c, "is now backup", qc->path);
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
470
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
471 } else {
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
472 if (ngx_quic_free_path(c, qc->path) != NGX_OK) {
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
473 return NGX_ERROR;
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
474 }
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
475 }
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
476
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
477 /* switch active path to migrated */
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
478 qc->path = next;
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
479 qc->path->tag = NGX_QUIC_PATH_ACTIVE;
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
480
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
481 ngx_quic_set_connection_path(c, next);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
482
9147
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
483 if (!next->validated && next->state != NGX_QUIC_PATH_VALIDATING) {
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
484 if (ngx_quic_validate_path(c, next) != NGX_OK) {
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
485 return NGX_ERROR;
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
486 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
487 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
488
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
489 ngx_log_error(NGX_LOG_INFO, c->log, 0,
8997
fab36e4abf83 QUIC: got rid of hash symbol in backup and logging.
Vladimir Homutov <vl@nginx.com>
parents: 8985
diff changeset
490 "quic migrated to path seq:%uL addr:%V",
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
491 qc->path->seqnum, &qc->path->addr_text);
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
492
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
493 ngx_quic_path_dbg(c, "is now active", qc->path);
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
494
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
495 return NGX_OK;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
496 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
497
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
498
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
499 static ngx_int_t
8944
b7284807b4fa QUIC: refactored ngx_quic_validate_path().
Vladimir Homutov <vl@nginx.com>
parents: 8943
diff changeset
500 ngx_quic_validate_path(ngx_connection_t *c, ngx_quic_path_t *path)
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
501 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
502 ngx_msec_t pto;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
503 ngx_quic_send_ctx_t *ctx;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
504 ngx_quic_connection_t *qc;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
505
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
506 qc = ngx_quic_get_connection(c);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
507
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
508 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
8997
fab36e4abf83 QUIC: got rid of hash symbol in backup and logging.
Vladimir Homutov <vl@nginx.com>
parents: 8985
diff changeset
509 "quic initiated validation of path seq:%uL", path->seqnum);
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
510
9096
c6db94ec3841 QUIC: separated path validation retransmit backoff.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9029
diff changeset
511 path->tries = 0;
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
512
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
513 if (RAND_bytes(path->challenge1, 8) != 1) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
514 return NGX_ERROR;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
515 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
516
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
517 if (RAND_bytes(path->challenge2, 8) != 1) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
518 return NGX_ERROR;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
519 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
520
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
521 if (ngx_quic_send_path_challenge(c, path) != NGX_OK) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
522 return NGX_ERROR;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
523 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
524
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
525 ctx = ngx_quic_get_send_ctx(qc, ssl_encryption_application);
9097
a9fef6ca45a8 QUIC: lower bound path validation PTO.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9096
diff changeset
526 pto = ngx_max(ngx_quic_pto(c, ctx), 1000);
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
527
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
528 path->expires = ngx_current_msec + pto;
9147
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
529 path->state = NGX_QUIC_PATH_VALIDATING;
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
530
9098
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
531 ngx_quic_set_path_timer(c);
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
532
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
533 return NGX_OK;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
534 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
535
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
536
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
537 static ngx_int_t
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
538 ngx_quic_send_path_challenge(ngx_connection_t *c, ngx_quic_path_t *path)
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
539 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
540 ngx_quic_frame_t frame;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
541
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
542 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
8997
fab36e4abf83 QUIC: got rid of hash symbol in backup and logging.
Vladimir Homutov <vl@nginx.com>
parents: 8985
diff changeset
543 "quic path seq:%uL send path_challenge tries:%ui",
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
544 path->seqnum, path->tries);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
545
8933
02a9ad88e2df QUIC: added missing frame initialization.
Vladimir Homutov <vl@nginx.com>
parents: 8932
diff changeset
546 ngx_memzero(&frame, sizeof(ngx_quic_frame_t));
02a9ad88e2df QUIC: added missing frame initialization.
Vladimir Homutov <vl@nginx.com>
parents: 8932
diff changeset
547
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
548 frame.level = ssl_encryption_application;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
549 frame.type = NGX_QUIC_FT_PATH_CHALLENGE;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
550
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
551 ngx_memcpy(frame.u.path_challenge.data, path->challenge1, 8);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
552
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
553 /*
8797
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8778
diff changeset
554 * RFC 9000, 8.2.1. Initiating Path Validation
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8778
diff changeset
555 *
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
556 * An endpoint MUST expand datagrams that contain a PATH_CHALLENGE frame
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
557 * to at least the smallest allowed maximum datagram size of 1200 bytes,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
558 * unless the anti-amplification limit for the path does not permit
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
559 * sending a datagram of this size.
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
560 */
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
561
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
562 /* same applies to PATH_RESPONSE frames */
9146
f3412ec3b6d1 QUIC: allowed ngx_quic_frame_sendto() to return NGX_AGAIN.
Roman Arutyunyan <arut@nginx.com>
parents: 9144
diff changeset
563 if (ngx_quic_frame_sendto(c, &frame, 1200, path) == NGX_ERROR) {
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
564 return NGX_ERROR;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
565 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
566
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
567 ngx_memcpy(frame.u.path_challenge.data, path->challenge2, 8);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
568
9146
f3412ec3b6d1 QUIC: allowed ngx_quic_frame_sendto() to return NGX_AGAIN.
Roman Arutyunyan <arut@nginx.com>
parents: 9144
diff changeset
569 if (ngx_quic_frame_sendto(c, &frame, 1200, path) == NGX_ERROR) {
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
570 return NGX_ERROR;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
571 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
572
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
573 return NGX_OK;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
574 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
575
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
576
9147
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
577 void
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
578 ngx_quic_discover_path_mtu(ngx_connection_t *c, ngx_quic_path_t *path)
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
579 {
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
580 ngx_quic_connection_t *qc;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
581
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
582 qc = ngx_quic_get_connection(c);
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
583
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
584 if (path->max_mtu) {
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
585 if (path->max_mtu - path->mtu <= NGX_QUIC_PATH_MTU_PRECISION) {
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
586 path->state = NGX_QUIC_PATH_IDLE;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
587 ngx_quic_set_path_timer(c);
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
588 return;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
589 }
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
590
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
591 path->mtud = (path->mtu + path->max_mtu) / 2;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
592
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
593 } else {
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
594 path->mtud = path->mtu * 2;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
595
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
596 if (path->mtud >= qc->ctp.max_udp_payload_size) {
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
597 path->mtud = qc->ctp.max_udp_payload_size;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
598 path->max_mtu = qc->ctp.max_udp_payload_size;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
599 }
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
600 }
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
601
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
602 path->state = NGX_QUIC_PATH_WAITING;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
603 path->expires = ngx_current_msec + NGX_QUIC_PATH_MTU_DELAY;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
604
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
605 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
606 "quic path seq:%uL schedule mtu:%uz",
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
607 path->seqnum, path->mtud);
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
608
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
609 ngx_quic_set_path_timer(c);
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
610 }
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
611
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
612
9098
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
613 static void
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
614 ngx_quic_set_path_timer(ngx_connection_t *c)
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
615 {
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
616 ngx_msec_t now;
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
617 ngx_queue_t *q;
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
618 ngx_msec_int_t left, next;
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
619 ngx_quic_path_t *path;
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
620 ngx_quic_connection_t *qc;
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
621
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
622 qc = ngx_quic_get_connection(c);
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
623
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
624 now = ngx_current_msec;
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
625 next = -1;
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
626
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
627 for (q = ngx_queue_head(&qc->paths);
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
628 q != ngx_queue_sentinel(&qc->paths);
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
629 q = ngx_queue_next(q))
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
630 {
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
631 path = ngx_queue_data(q, ngx_quic_path_t, queue);
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
632
9147
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
633 if (path->state == NGX_QUIC_PATH_IDLE) {
9098
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
634 continue;
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
635 }
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
636
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
637 left = path->expires - now;
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
638 left = ngx_max(left, 1);
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
639
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
640 if (next == -1 || left < next) {
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
641 next = left;
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
642 }
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
643 }
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
644
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
645 if (next != -1) {
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
646 ngx_add_timer(&qc->path_validation, next);
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
647
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
648 } else if (qc->path_validation.timer_set) {
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
649 ngx_del_timer(&qc->path_validation);
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
650 }
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
651 }
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
652
d565cf69ff5d QUIC: reschedule path validation on path insertion/removal.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9097
diff changeset
653
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
654 void
9147
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
655 ngx_quic_path_handler(ngx_event_t *ev)
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
656 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
657 ngx_msec_t now;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
658 ngx_queue_t *q;
9147
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
659 ngx_msec_int_t left;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
660 ngx_quic_path_t *path;
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
661 ngx_connection_t *c;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
662 ngx_quic_connection_t *qc;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
663
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
664 c = ev->data;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
665 qc = ngx_quic_get_connection(c);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
666
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
667 now = ngx_current_msec;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
668
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
669 q = ngx_queue_head(&qc->paths);
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
670
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
671 while (q != ngx_queue_sentinel(&qc->paths)) {
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
672
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
673 path = ngx_queue_data(q, ngx_quic_path_t, queue);
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
674 q = ngx_queue_next(q);
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
675
9147
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
676 if (path->state == NGX_QUIC_PATH_IDLE) {
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
677 continue;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
678 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
679
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
680 left = path->expires - now;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
681
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
682 if (left > 0) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
683 continue;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
684 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
685
9147
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
686 switch (path->state) {
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
687 case NGX_QUIC_PATH_VALIDATING:
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
688 if (ngx_quic_expire_path_validation(c, path) != NGX_OK) {
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
689 goto failed;
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
690 }
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
691
9147
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
692 break;
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
693
9147
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
694 case NGX_QUIC_PATH_WAITING:
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
695 if (ngx_quic_expire_path_mtu_delay(c, path) != NGX_OK) {
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
696 goto failed;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
697 }
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
698
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
699 break;
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
700
9147
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
701 case NGX_QUIC_PATH_MTUD:
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
702 if (ngx_quic_expire_path_mtu_discovery(c, path) != NGX_OK) {
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
703 goto failed;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
704 }
8971
1e2f4e9c8195 QUIC: reworked migration handling.
Vladimir Homutov <vl@nginx.com>
parents: 8944
diff changeset
705
9147
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
706 break;
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
707
9147
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
708 default:
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
709 break;
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
710 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
711 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
712
9147
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
713 ngx_quic_set_path_timer(c);
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
714
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
715 return;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
716
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
717 failed:
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
718
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
719 ngx_quic_close_connection(c, NGX_ERROR);
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
720 }
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
721
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
722
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
723 static ngx_int_t
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
724 ngx_quic_expire_path_validation(ngx_connection_t *c, ngx_quic_path_t *path)
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
725 {
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
726 ngx_msec_int_t pto;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
727 ngx_quic_path_t *bkp;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
728 ngx_quic_send_ctx_t *ctx;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
729 ngx_quic_connection_t *qc;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
730
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
731 qc = ngx_quic_get_connection(c);
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
732 ctx = ngx_quic_get_send_ctx(qc, ssl_encryption_application);
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
733
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
734 if (++path->tries < NGX_QUIC_PATH_RETRIES) {
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
735 pto = ngx_max(ngx_quic_pto(c, ctx), 1000) << path->tries;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
736 path->expires = ngx_current_msec + pto;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
737
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
738 (void) ngx_quic_send_path_challenge(c, path);
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
739
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
740 return NGX_OK;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
741 }
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
742
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
743 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
744 "quic path seq:%uL validation failed", path->seqnum);
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
745
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
746 /* found expired path */
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
747
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
748 path->validated = 0;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
749
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
750
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
751 /* RFC 9000, 9.3.2. On-Path Address Spoofing
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
752 *
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
753 * To protect the connection from failing due to such a spurious
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
754 * migration, an endpoint MUST revert to using the last validated
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
755 * peer address when validation of a new peer address fails.
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
756 */
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
757
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
758 if (qc->path == path) {
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
759 /* active path validation failed */
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
760
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
761 bkp = ngx_quic_get_path(c, NGX_QUIC_PATH_BACKUP);
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
762
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
763 if (bkp == NULL) {
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
764 qc->error = NGX_QUIC_ERR_NO_VIABLE_PATH;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
765 qc->error_reason = "no viable path";
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
766 return NGX_ERROR;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
767 }
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
768
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
769 qc->path = bkp;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
770 qc->path->tag = NGX_QUIC_PATH_ACTIVE;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
771
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
772 ngx_quic_set_connection_path(c, qc->path);
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
773
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
774 ngx_log_error(NGX_LOG_INFO, c->log, 0,
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
775 "quic path seq:%uL addr:%V is restored from backup",
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
776 qc->path->seqnum, &qc->path->addr_text);
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
777
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
778 ngx_quic_path_dbg(c, "is active", qc->path);
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
779 }
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
780
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
781 return ngx_quic_free_path(c, path);
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
782 }
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
783
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
784
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
785 static ngx_int_t
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
786 ngx_quic_expire_path_mtu_delay(ngx_connection_t *c, ngx_quic_path_t *path)
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
787 {
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
788 ngx_int_t rc;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
789 ngx_uint_t i;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
790 ngx_msec_t pto;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
791 ngx_quic_send_ctx_t *ctx;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
792 ngx_quic_connection_t *qc;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
793
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
794 qc = ngx_quic_get_connection(c);
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
795 ctx = ngx_quic_get_send_ctx(qc, ssl_encryption_application);
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
796
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
797 path->tries = 0;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
798
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
799 for ( ;; ) {
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
800
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
801 for (i = 0; i < NGX_QUIC_PATH_RETRIES; i++) {
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
802 path->mtu_pnum[i] = NGX_QUIC_UNSET_PN;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
803 }
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
804
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
805 rc = ngx_quic_send_path_mtu_probe(c, path);
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
806
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
807 if (rc == NGX_ERROR) {
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
808 return NGX_ERROR;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
809 }
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
810
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
811 if (rc == NGX_OK) {
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
812 pto = ngx_quic_pto(c, ctx);
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
813 path->expires = ngx_current_msec + pto;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
814 path->state = NGX_QUIC_PATH_MTUD;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
815 return NGX_OK;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
816 }
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
817
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
818 /* rc == NGX_DECLINED */
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
819
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
820 path->max_mtu = path->mtud;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
821
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
822 if (path->max_mtu - path->mtu <= NGX_QUIC_PATH_MTU_PRECISION) {
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
823 path->state = NGX_QUIC_PATH_IDLE;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
824 return NGX_OK;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
825 }
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
826
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
827 path->mtud = (path->mtu + path->max_mtu) / 2;
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
828 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8747
diff changeset
829 }
9147
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
830
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
831
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
832 static ngx_int_t
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
833 ngx_quic_expire_path_mtu_discovery(ngx_connection_t *c, ngx_quic_path_t *path)
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
834 {
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
835 ngx_int_t rc;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
836 ngx_msec_int_t pto;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
837 ngx_quic_send_ctx_t *ctx;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
838 ngx_quic_connection_t *qc;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
839
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
840 qc = ngx_quic_get_connection(c);
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
841 ctx = ngx_quic_get_send_ctx(qc, ssl_encryption_application);
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
842
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
843 if (++path->tries < NGX_QUIC_PATH_RETRIES) {
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
844 rc = ngx_quic_send_path_mtu_probe(c, path);
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
845
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
846 if (rc == NGX_ERROR) {
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
847 return NGX_ERROR;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
848 }
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
849
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
850 if (rc == NGX_OK) {
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
851 pto = ngx_quic_pto(c, ctx) << path->tries;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
852 path->expires = ngx_current_msec + pto;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
853 return NGX_OK;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
854 }
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
855
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
856 /* rc == NGX_DECLINED */
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
857 }
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
858
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
859 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
860 "quic path seq:%uL expired mtu:%uz",
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
861 path->seqnum, path->mtud);
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
862
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
863 path->max_mtu = path->mtud;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
864
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
865 ngx_quic_discover_path_mtu(c, path);
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
866
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
867 return NGX_OK;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
868 }
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
869
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
870
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
871 static ngx_int_t
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
872 ngx_quic_send_path_mtu_probe(ngx_connection_t *c, ngx_quic_path_t *path)
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
873 {
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
874 ngx_int_t rc;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
875 ngx_uint_t log_error;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
876 ngx_quic_frame_t frame;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
877 ngx_quic_send_ctx_t *ctx;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
878 ngx_quic_connection_t *qc;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
879
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
880 ngx_memzero(&frame, sizeof(ngx_quic_frame_t));
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
881
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
882 frame.level = ssl_encryption_application;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
883 frame.type = NGX_QUIC_FT_PING;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
884
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
885 qc = ngx_quic_get_connection(c);
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
886 ctx = ngx_quic_get_send_ctx(qc, ssl_encryption_application);
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
887 path->mtu_pnum[path->tries] = ctx->pnum;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
888
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
889 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
890 "quic path seq:%uL send probe "
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
891 "mtu:%uz pnum:%uL tries:%ui",
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
892 path->seqnum, path->mtud, ctx->pnum, path->tries);
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
893
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
894 log_error = c->log_error;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
895 c->log_error = NGX_ERROR_IGNORE_EMSGSIZE;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
896
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
897 rc = ngx_quic_frame_sendto(c, &frame, path->mtud, path);
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
898 c->log_error = log_error;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
899
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
900 if (rc == NGX_ERROR) {
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
901 if (c->write->error) {
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
902 c->write->error = 0;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
903
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
904 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
905 "quic path seq:%uL rejected mtu:%uz",
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
906 path->seqnum, path->mtud);
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
907
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
908 return NGX_DECLINED;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
909 }
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
910
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
911 return NGX_ERROR;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
912 }
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
913
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
914 return NGX_OK;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
915 }
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
916
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
917
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
918 ngx_int_t
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
919 ngx_quic_handle_path_mtu(ngx_connection_t *c, ngx_quic_path_t *path,
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
920 uint64_t min, uint64_t max)
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
921 {
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
922 uint64_t pnum;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
923 ngx_uint_t i;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
924
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
925 if (path->state != NGX_QUIC_PATH_MTUD) {
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
926 return NGX_OK;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
927 }
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
928
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
929 for (i = 0; i < NGX_QUIC_PATH_RETRIES; i++) {
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
930 pnum = path->mtu_pnum[i];
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
931
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
932 if (pnum == NGX_QUIC_UNSET_PN) {
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
933 break;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
934 }
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
935
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
936 if (pnum < min || pnum > max) {
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
937 continue;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
938 }
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
939
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
940 path->mtu = path->mtud;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
941
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
942 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
943 "quic path seq:%uL ack mtu:%uz",
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
944 path->seqnum, path->mtu);
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
945
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
946 ngx_quic_discover_path_mtu(c, path);
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
947
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
948 break;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
949 }
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
950
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
951 return NGX_OK;
58afcd72446f QUIC: path MTU discovery.
Roman Arutyunyan <arut@nginx.com>
parents: 9146
diff changeset
952 }