annotate src/event/quic/ngx_event_quic_connid.c @ 8920:9680f0badc95 quic

QUIC: fixed using of retired connection id (ticket #2289). RFC 9000 19.16 The sequence number specified in a RETIRE_CONNECTION_ID frame MUST NOT refer to the Destination Connection ID field of the packet in which the frame is contained. Before the patch, the RETIRE_CONNECTION_ID frame was sent before switching to the new client id. If retired client id was currently in use, this lead to violation of the spec.
author Vladimir Homutov <vl@nginx.com>
date Thu, 02 Dec 2021 14:09:52 +0300
parents b09f055daa4e
children 32daba3aabb2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8748
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
2 /*
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
3 * Copyright (C) Nginx, Inc.
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
4 */
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
5
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
6
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
7 #include <ngx_config.h>
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
8 #include <ngx_core.h>
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
9 #include <ngx_event.h>
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
10 #include <ngx_event_quic_connection.h>
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
11
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
12 #define NGX_QUIC_MAX_SERVER_IDS 8
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
13
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
14
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
15 #if (NGX_QUIC_BPF)
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
16 static ngx_int_t ngx_quic_bpf_attach_id(ngx_connection_t *c, u_char *id);
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
17 #endif
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
18 static ngx_int_t ngx_quic_send_retire_connection_id(ngx_connection_t *c,
8778
5186ee5a94b9 QUIC: simplified sending 1-RTT only frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8777
diff changeset
19 uint64_t seqnum);
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
20
8748
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
21 static ngx_quic_client_id_t *ngx_quic_alloc_client_id(ngx_connection_t *c,
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
22 ngx_quic_connection_t *qc);
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
23 static ngx_int_t ngx_quic_replace_retired_client_id(ngx_connection_t *c,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
24 ngx_quic_client_id_t *retired_cid);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
25 static ngx_int_t ngx_quic_send_server_id(ngx_connection_t *c,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
26 ngx_quic_server_id_t *sid);
8748
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
27
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
28
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
29 ngx_int_t
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
30 ngx_quic_create_server_id(ngx_connection_t *c, u_char *id)
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
31 {
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
32 if (RAND_bytes(id, NGX_QUIC_SERVER_CID_LEN) != 1) {
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
33 return NGX_ERROR;
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
34 }
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
35
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
36 #if (NGX_QUIC_BPF)
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
37 if (ngx_quic_bpf_attach_id(c, id) != NGX_OK) {
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
38 ngx_log_error(NGX_LOG_ERR, c->log, 0,
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
39 "quic bpf failed to generate socket key");
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
40 /* ignore error, things still may work */
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
41 }
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
42 #endif
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
43
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
44 return NGX_OK;
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
45 }
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
46
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
47
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
48 #if (NGX_QUIC_BPF)
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
49
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
50 static ngx_int_t
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
51 ngx_quic_bpf_attach_id(ngx_connection_t *c, u_char *id)
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
52 {
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
53 int fd;
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
54 uint64_t cookie;
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
55 socklen_t optlen;
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
56
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
57 fd = c->listening->fd;
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
58
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
59 optlen = sizeof(cookie);
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
60
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
61 if (getsockopt(fd, SOL_SOCKET, SO_COOKIE, &cookie, &optlen) == -1) {
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
62 ngx_log_error(NGX_LOG_ERR, c->log, ngx_socket_errno,
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
63 "quic getsockopt(SO_COOKIE) failed");
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
64
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
65 return NGX_ERROR;
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
66 }
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
67
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
68 ngx_quic_dcid_encode_key(id, cookie);
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
69
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
70 return NGX_OK;
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
71 }
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
72
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
73 #endif
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
74
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
75
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
76 ngx_int_t
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
77 ngx_quic_handle_new_connection_id_frame(ngx_connection_t *c,
8778
5186ee5a94b9 QUIC: simplified sending 1-RTT only frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8777
diff changeset
78 ngx_quic_new_conn_id_frame_t *f)
8748
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
79 {
8920
9680f0badc95 QUIC: fixed using of retired connection id (ticket #2289).
Vladimir Homutov <vl@nginx.com>
parents: 8911
diff changeset
80 uint64_t seq;
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
81 ngx_str_t id;
8748
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
82 ngx_queue_t *q;
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
83 ngx_quic_client_id_t *cid, *item;
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
84 ngx_quic_connection_t *qc;
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
85
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
86 qc = ngx_quic_get_connection(c);
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
87
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
88 if (f->seqnum < qc->max_retired_seqnum) {
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
89 /*
8797
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8778
diff changeset
90 * RFC 9000, 19.15. NEW_CONNECTION_ID Frame
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8778
diff changeset
91 *
8748
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
92 * An endpoint that receives a NEW_CONNECTION_ID frame with
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
93 * a sequence number smaller than the Retire Prior To field
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
94 * of a previously received NEW_CONNECTION_ID frame MUST send
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
95 * a corresponding RETIRE_CONNECTION_ID frame that retires
8797
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8778
diff changeset
96 * the newly received connection ID, unless it has already
8748
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
97 * done so for that sequence number.
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
98 */
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
99
8778
5186ee5a94b9 QUIC: simplified sending 1-RTT only frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8777
diff changeset
100 if (ngx_quic_send_retire_connection_id(c, f->seqnum) != NGX_OK) {
8748
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
101 return NGX_ERROR;
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
102 }
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
103
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
104 goto retire;
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
105 }
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
106
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
107 cid = NULL;
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
108
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
109 for (q = ngx_queue_head(&qc->client_ids);
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
110 q != ngx_queue_sentinel(&qc->client_ids);
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
111 q = ngx_queue_next(q))
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
112 {
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
113 item = ngx_queue_data(q, ngx_quic_client_id_t, queue);
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
114
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
115 if (item->seqnum == f->seqnum) {
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
116 cid = item;
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
117 break;
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
118 }
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
119 }
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
120
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
121 if (cid) {
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
122 /*
8797
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8778
diff changeset
123 * Transmission errors, timeouts, and retransmissions might cause the
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8778
diff changeset
124 * same NEW_CONNECTION_ID frame to be received multiple times.
8748
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
125 */
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
126
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
127 if (cid->len != f->len
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
128 || ngx_strncmp(cid->id, f->cid, f->len) != 0
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
129 || ngx_strncmp(cid->sr_token, f->srt, NGX_QUIC_SR_TOKEN_LEN) != 0)
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
130 {
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
131 /*
8797
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8778
diff changeset
132 * ..if a sequence number is used for different connection IDs,
8748
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
133 * the endpoint MAY treat that receipt as a connection error
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
134 * of type PROTOCOL_VIOLATION.
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
135 */
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
136 qc->error = NGX_QUIC_ERR_PROTOCOL_VIOLATION;
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
137 qc->error_reason = "seqnum refers to different connection id/token";
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
138 return NGX_ERROR;
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
139 }
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
140
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
141 } else {
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
142
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
143 id.data = f->cid;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
144 id.len = f->len;
8748
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
145
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
146 if (ngx_quic_create_client_id(c, &id, f->seqnum, f->srt) == NULL) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
147 return NGX_ERROR;
8748
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
148 }
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
149 }
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
150
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
151 retire:
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
152
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
153 if (qc->max_retired_seqnum && f->retire <= qc->max_retired_seqnum) {
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
154 /*
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
155 * Once a sender indicates a Retire Prior To value, smaller values sent
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
156 * in subsequent NEW_CONNECTION_ID frames have no effect. A receiver
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
157 * MUST ignore any Retire Prior To fields that do not increase the
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
158 * largest received Retire Prior To value.
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
159 */
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
160 goto done;
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
161 }
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
162
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
163 qc->max_retired_seqnum = f->retire;
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
164
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
165 q = ngx_queue_head(&qc->client_ids);
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
166
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
167 while (q != ngx_queue_sentinel(&qc->client_ids)) {
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
168
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
169 cid = ngx_queue_data(q, ngx_quic_client_id_t, queue);
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
170 q = ngx_queue_next(q);
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
171
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
172 if (cid->seqnum >= f->retire) {
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
173 continue;
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
174 }
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
175
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
176 /* this connection id must be retired */
8920
9680f0badc95 QUIC: fixed using of retired connection id (ticket #2289).
Vladimir Homutov <vl@nginx.com>
parents: 8911
diff changeset
177 seq = cid->seqnum;
8748
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
178
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
179 if (cid->refcnt) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
180 /* we are going to retire client id which is in use */
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
181 if (ngx_quic_replace_retired_client_id(c, cid) != NGX_OK) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
182 return NGX_ERROR;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
183 }
8896
e2ec952dc295 QUIC: fixed removal of unused client IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8797
diff changeset
184
e2ec952dc295 QUIC: fixed removal of unused client IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8797
diff changeset
185 } else {
e2ec952dc295 QUIC: fixed removal of unused client IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8797
diff changeset
186 ngx_quic_unref_client_id(c, cid);
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
187 }
8920
9680f0badc95 QUIC: fixed using of retired connection id (ticket #2289).
Vladimir Homutov <vl@nginx.com>
parents: 8911
diff changeset
188
9680f0badc95 QUIC: fixed using of retired connection id (ticket #2289).
Vladimir Homutov <vl@nginx.com>
parents: 8911
diff changeset
189 if (ngx_quic_send_retire_connection_id(c, seq) != NGX_OK) {
9680f0badc95 QUIC: fixed using of retired connection id (ticket #2289).
Vladimir Homutov <vl@nginx.com>
parents: 8911
diff changeset
190 return NGX_ERROR;
9680f0badc95 QUIC: fixed using of retired connection id (ticket #2289).
Vladimir Homutov <vl@nginx.com>
parents: 8911
diff changeset
191 }
8748
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
192 }
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
193
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
194 done:
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
195
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
196 if (qc->nclient_ids > qc->tp.active_connection_id_limit) {
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
197 /*
8797
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8778
diff changeset
198 * RFC 9000, 5.1.1. Issuing Connection IDs
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8778
diff changeset
199 *
8748
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
200 * After processing a NEW_CONNECTION_ID frame and
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
201 * adding and retiring active connection IDs, if the number of active
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
202 * connection IDs exceeds the value advertised in its
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
203 * active_connection_id_limit transport parameter, an endpoint MUST
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
204 * close the connection with an error of type CONNECTION_ID_LIMIT_ERROR.
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
205 */
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
206 qc->error = NGX_QUIC_ERR_CONNECTION_ID_LIMIT_ERROR;
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
207 qc->error_reason = "too many connection ids received";
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
208 return NGX_ERROR;
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
209 }
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
210
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
211 return NGX_OK;
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
212 }
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
213
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
214
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
215 static ngx_int_t
8778
5186ee5a94b9 QUIC: simplified sending 1-RTT only frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8777
diff changeset
216 ngx_quic_send_retire_connection_id(ngx_connection_t *c, uint64_t seqnum)
8748
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
217 {
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
218 ngx_quic_frame_t *frame;
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
219 ngx_quic_connection_t *qc;
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
220
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
221 qc = ngx_quic_get_connection(c);
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
222
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
223 frame = ngx_quic_alloc_frame(c);
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
224 if (frame == NULL) {
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
225 return NGX_ERROR;
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
226 }
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
227
8778
5186ee5a94b9 QUIC: simplified sending 1-RTT only frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8777
diff changeset
228 frame->level = ssl_encryption_application;
8748
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
229 frame->type = NGX_QUIC_FT_RETIRE_CONNECTION_ID;
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
230 frame->u.retire_cid.sequence_number = seqnum;
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
231
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
232 ngx_quic_queue_frame(qc, frame);
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
233
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
234 /* we are no longer going to use this client id */
8748
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
235
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
236 return NGX_OK;
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
237 }
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
238
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
239
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
240 static ngx_quic_client_id_t *
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
241 ngx_quic_alloc_client_id(ngx_connection_t *c, ngx_quic_connection_t *qc)
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
242 {
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
243 ngx_queue_t *q;
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
244 ngx_quic_client_id_t *cid;
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
245
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
246 if (!ngx_queue_empty(&qc->free_client_ids)) {
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
247
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
248 q = ngx_queue_head(&qc->free_client_ids);
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
249 cid = ngx_queue_data(q, ngx_quic_client_id_t, queue);
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
250
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
251 ngx_queue_remove(&cid->queue);
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
252
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
253 ngx_memzero(cid, sizeof(ngx_quic_client_id_t));
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
254
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
255 } else {
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
256
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
257 cid = ngx_pcalloc(c->pool, sizeof(ngx_quic_client_id_t));
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
258 if (cid == NULL) {
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
259 return NULL;
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
260 }
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
261 }
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
262
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
263 return cid;
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
264 }
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
265
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
266
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
267 ngx_quic_client_id_t *
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
268 ngx_quic_create_client_id(ngx_connection_t *c, ngx_str_t *id,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
269 uint64_t seqnum, u_char *token)
8748
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
270 {
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
271 ngx_quic_client_id_t *cid;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
272 ngx_quic_connection_t *qc;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
273
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
274 qc = ngx_quic_get_connection(c);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
275
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
276 cid = ngx_quic_alloc_client_id(c, qc);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
277 if (cid == NULL) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
278 return NULL;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
279 }
8748
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
280
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
281 cid->seqnum = seqnum;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
282
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
283 cid->len = id->len;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
284 ngx_memcpy(cid->id, id->data, id->len);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
285
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
286 if (token) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
287 ngx_memcpy(cid->sr_token, token, NGX_QUIC_SR_TOKEN_LEN);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
288 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
289
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
290 ngx_queue_insert_tail(&qc->client_ids, &cid->queue);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
291 qc->nclient_ids++;
8748
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
292
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
293 if (seqnum > qc->client_seqnum) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
294 qc->client_seqnum = seqnum;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
295 }
8748
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
296
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
297 ngx_log_debug5(NGX_LOG_DEBUG_EVENT, c->log, 0,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
298 "quic cid #%uL received id:%uz:%xV:%*xs",
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
299 cid->seqnum, id->len, id,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
300 (size_t) NGX_QUIC_SR_TOKEN_LEN, cid->sr_token);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
301
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
302 return cid;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
303 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
304
8748
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
305
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
306 ngx_quic_client_id_t *
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
307 ngx_quic_next_client_id(ngx_connection_t *c)
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
308 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
309 ngx_queue_t *q;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
310 ngx_quic_client_id_t *cid;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
311 ngx_quic_connection_t *qc;
8748
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
312
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
313 qc = ngx_quic_get_connection(c);
8748
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
314
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
315 for (q = ngx_queue_head(&qc->client_ids);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
316 q != ngx_queue_sentinel(&qc->client_ids);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
317 q = ngx_queue_next(q))
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
318 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
319 cid = ngx_queue_data(q, ngx_quic_client_id_t, queue);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
320
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
321 if (cid->refcnt == 0) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
322 return cid;
8748
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
323 }
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
324 }
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
325
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
326 return NULL;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
327 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
328
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
329
8777
d5f93733c17d QUIC: relaxed client id requirements.
Vladimir Homutov <vl@nginx.com>
parents: 8763
diff changeset
330 ngx_quic_client_id_t *
d5f93733c17d QUIC: relaxed client id requirements.
Vladimir Homutov <vl@nginx.com>
parents: 8763
diff changeset
331 ngx_quic_used_client_id(ngx_connection_t *c, ngx_quic_path_t *path)
d5f93733c17d QUIC: relaxed client id requirements.
Vladimir Homutov <vl@nginx.com>
parents: 8763
diff changeset
332 {
d5f93733c17d QUIC: relaxed client id requirements.
Vladimir Homutov <vl@nginx.com>
parents: 8763
diff changeset
333 ngx_queue_t *q;
d5f93733c17d QUIC: relaxed client id requirements.
Vladimir Homutov <vl@nginx.com>
parents: 8763
diff changeset
334 ngx_quic_socket_t *qsock;
d5f93733c17d QUIC: relaxed client id requirements.
Vladimir Homutov <vl@nginx.com>
parents: 8763
diff changeset
335 ngx_quic_connection_t *qc;
d5f93733c17d QUIC: relaxed client id requirements.
Vladimir Homutov <vl@nginx.com>
parents: 8763
diff changeset
336
d5f93733c17d QUIC: relaxed client id requirements.
Vladimir Homutov <vl@nginx.com>
parents: 8763
diff changeset
337 qc = ngx_quic_get_connection(c);
d5f93733c17d QUIC: relaxed client id requirements.
Vladimir Homutov <vl@nginx.com>
parents: 8763
diff changeset
338
d5f93733c17d QUIC: relaxed client id requirements.
Vladimir Homutov <vl@nginx.com>
parents: 8763
diff changeset
339 /* best guess: cid used by active path is good for us */
d5f93733c17d QUIC: relaxed client id requirements.
Vladimir Homutov <vl@nginx.com>
parents: 8763
diff changeset
340 if (qc->socket->path == path) {
d5f93733c17d QUIC: relaxed client id requirements.
Vladimir Homutov <vl@nginx.com>
parents: 8763
diff changeset
341 return qc->socket->cid;
d5f93733c17d QUIC: relaxed client id requirements.
Vladimir Homutov <vl@nginx.com>
parents: 8763
diff changeset
342 }
d5f93733c17d QUIC: relaxed client id requirements.
Vladimir Homutov <vl@nginx.com>
parents: 8763
diff changeset
343
d5f93733c17d QUIC: relaxed client id requirements.
Vladimir Homutov <vl@nginx.com>
parents: 8763
diff changeset
344 for (q = ngx_queue_head(&qc->sockets);
d5f93733c17d QUIC: relaxed client id requirements.
Vladimir Homutov <vl@nginx.com>
parents: 8763
diff changeset
345 q != ngx_queue_sentinel(&qc->sockets);
d5f93733c17d QUIC: relaxed client id requirements.
Vladimir Homutov <vl@nginx.com>
parents: 8763
diff changeset
346 q = ngx_queue_next(q))
d5f93733c17d QUIC: relaxed client id requirements.
Vladimir Homutov <vl@nginx.com>
parents: 8763
diff changeset
347 {
d5f93733c17d QUIC: relaxed client id requirements.
Vladimir Homutov <vl@nginx.com>
parents: 8763
diff changeset
348 qsock = ngx_queue_data(q, ngx_quic_socket_t, queue);
d5f93733c17d QUIC: relaxed client id requirements.
Vladimir Homutov <vl@nginx.com>
parents: 8763
diff changeset
349
d5f93733c17d QUIC: relaxed client id requirements.
Vladimir Homutov <vl@nginx.com>
parents: 8763
diff changeset
350 if (qsock->path && qsock->path == path) {
d5f93733c17d QUIC: relaxed client id requirements.
Vladimir Homutov <vl@nginx.com>
parents: 8763
diff changeset
351 return qsock->cid;
d5f93733c17d QUIC: relaxed client id requirements.
Vladimir Homutov <vl@nginx.com>
parents: 8763
diff changeset
352 }
d5f93733c17d QUIC: relaxed client id requirements.
Vladimir Homutov <vl@nginx.com>
parents: 8763
diff changeset
353 }
d5f93733c17d QUIC: relaxed client id requirements.
Vladimir Homutov <vl@nginx.com>
parents: 8763
diff changeset
354
d5f93733c17d QUIC: relaxed client id requirements.
Vladimir Homutov <vl@nginx.com>
parents: 8763
diff changeset
355 return NULL;
d5f93733c17d QUIC: relaxed client id requirements.
Vladimir Homutov <vl@nginx.com>
parents: 8763
diff changeset
356 }
d5f93733c17d QUIC: relaxed client id requirements.
Vladimir Homutov <vl@nginx.com>
parents: 8763
diff changeset
357
d5f93733c17d QUIC: relaxed client id requirements.
Vladimir Homutov <vl@nginx.com>
parents: 8763
diff changeset
358
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
359 ngx_int_t
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
360 ngx_quic_handle_retire_connection_id_frame(ngx_connection_t *c,
8778
5186ee5a94b9 QUIC: simplified sending 1-RTT only frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8777
diff changeset
361 ngx_quic_retire_cid_frame_t *f)
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
362 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
363 ngx_quic_path_t *path;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
364 ngx_quic_socket_t *qsock, **tmp;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
365 ngx_quic_client_id_t *cid;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
366 ngx_quic_connection_t *qc;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
367
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
368 qc = ngx_quic_get_connection(c);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
369
8910
f8848f5a1014 QUIC: additional checks for the RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8896
diff changeset
370 if (f->sequence_number >= qc->server_seqnum) {
f8848f5a1014 QUIC: additional checks for the RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8896
diff changeset
371 /*
f8848f5a1014 QUIC: additional checks for the RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8896
diff changeset
372 * RFC 9000, 19.16.
f8848f5a1014 QUIC: additional checks for the RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8896
diff changeset
373 *
f8848f5a1014 QUIC: additional checks for the RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8896
diff changeset
374 * Receipt of a RETIRE_CONNECTION_ID frame containing a sequence
f8848f5a1014 QUIC: additional checks for the RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8896
diff changeset
375 * number greater than any previously sent to the peer MUST be
f8848f5a1014 QUIC: additional checks for the RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8896
diff changeset
376 * treated as a connection error of type PROTOCOL_VIOLATION.
f8848f5a1014 QUIC: additional checks for the RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8896
diff changeset
377 */
f8848f5a1014 QUIC: additional checks for the RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8896
diff changeset
378 qc->error = NGX_QUIC_ERR_PROTOCOL_VIOLATION;
f8848f5a1014 QUIC: additional checks for the RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8896
diff changeset
379 qc->error_reason = "sequence number of id to retire was never issued";
f8848f5a1014 QUIC: additional checks for the RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8896
diff changeset
380
f8848f5a1014 QUIC: additional checks for the RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8896
diff changeset
381 return NGX_ERROR;
f8848f5a1014 QUIC: additional checks for the RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8896
diff changeset
382 }
f8848f5a1014 QUIC: additional checks for the RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8896
diff changeset
383
f8848f5a1014 QUIC: additional checks for the RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8896
diff changeset
384 qsock = ngx_quic_get_socket(c);
f8848f5a1014 QUIC: additional checks for the RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8896
diff changeset
385
f8848f5a1014 QUIC: additional checks for the RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8896
diff changeset
386 if (qsock->sid.seqnum == f->sequence_number) {
f8848f5a1014 QUIC: additional checks for the RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8896
diff changeset
387
f8848f5a1014 QUIC: additional checks for the RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8896
diff changeset
388 /*
f8848f5a1014 QUIC: additional checks for the RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8896
diff changeset
389 * RFC 9000, 19.16.
f8848f5a1014 QUIC: additional checks for the RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8896
diff changeset
390 *
f8848f5a1014 QUIC: additional checks for the RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8896
diff changeset
391 * The sequence number specified in a RETIRE_CONNECTION_ID frame MUST
f8848f5a1014 QUIC: additional checks for the RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8896
diff changeset
392 * NOT refer to the Destination Connection ID field of the packet in
f8848f5a1014 QUIC: additional checks for the RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8896
diff changeset
393 * which the frame is contained. The peer MAY treat this as a
f8848f5a1014 QUIC: additional checks for the RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8896
diff changeset
394 * connection error of type PROTOCOL_VIOLATION.
f8848f5a1014 QUIC: additional checks for the RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8896
diff changeset
395 */
f8848f5a1014 QUIC: additional checks for the RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8896
diff changeset
396
f8848f5a1014 QUIC: additional checks for the RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8896
diff changeset
397 qc->error = NGX_QUIC_ERR_PROTOCOL_VIOLATION;
f8848f5a1014 QUIC: additional checks for the RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8896
diff changeset
398 qc->error_reason = "sequence number of id to retire refers DCID";
f8848f5a1014 QUIC: additional checks for the RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8896
diff changeset
399
f8848f5a1014 QUIC: additional checks for the RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8896
diff changeset
400 return NGX_ERROR;
f8848f5a1014 QUIC: additional checks for the RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8896
diff changeset
401 }
f8848f5a1014 QUIC: additional checks for the RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8896
diff changeset
402
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
403 qsock = ngx_quic_find_socket(c, f->sequence_number);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
404 if (qsock == NULL) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
405 return NGX_OK;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
406 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
407
8911
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
408 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
409 "quic socket #%uL is retired", qsock->sid.seqnum);
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
410
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
411 /* check if client is willing to retire sid we have in use */
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
412 if (qsock->sid.seqnum == qc->socket->sid.seqnum) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
413 tmp = &qc->socket;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
414
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
415 } else if (qc->backup && qsock->sid.seqnum == qc->backup->sid.seqnum) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
416 tmp = &qc->backup;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
417
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
418 } else {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
419
8911
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
420 ngx_quic_close_socket(c, qsock);
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
421
8911
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
422 /* restore socket count up to a limit after deletion */
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
423 if (ngx_quic_create_sockets(c) != NGX_OK) {
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
424 return NGX_ERROR;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
425 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
426
8911
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
427 return NGX_OK;
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
428 }
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
429
8911
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
430 /* preserve path/cid from retired socket */
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
431 path = qsock->path;
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
432 cid = qsock->cid;
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
433
8911
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
434 /* ensure that closing_socket will not drop path and cid */
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
435 path->refcnt++;
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
436 cid->refcnt++;
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
437
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
438 ngx_quic_close_socket(c, qsock);
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
439
8911
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
440 /* restore original values */
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
441 path->refcnt--;
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
442 cid->refcnt--;
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
443
8911
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
444 /* restore socket count up to a limit after deletion */
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
445 if (ngx_quic_create_sockets(c) != NGX_OK) {
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
446 goto failed;
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
447 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
448
8911
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
449 qsock = ngx_quic_get_unconnected_socket(c);
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
450 if (qsock == NULL) {
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
451 qc->error = NGX_QUIC_ERR_CONNECTION_ID_LIMIT_ERROR;
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
452 qc->error_reason = "not enough server IDs";
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
453 goto failed;
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
454 }
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
455
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
456 ngx_quic_connect(c, qsock, path, cid);
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
457
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
458 ngx_log_debug5(NGX_LOG_DEBUG_EVENT, c->log, 0,
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
459 "quic %s socket is now #%uL:%uL:%uL (%s)",
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
460 (*tmp) == qc->socket ? "active" : "backup",
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
461 qsock->sid.seqnum, qsock->cid->seqnum,
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
462 qsock->path->seqnum,
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
463 ngx_quic_path_state_str(qsock->path));
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
464
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
465 /* restore active/backup pointer in quic connection */
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
466 *tmp = qsock;
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
467
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
468 return NGX_OK;
8911
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
469
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
470 failed:
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
471
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
472 /*
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
473 * socket was closed, path and cid were preserved artifically
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
474 * to be reused, but it didn't happen, thus unref here
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
475 */
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
476
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
477 ngx_quic_unref_path(c, path);
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
478 ngx_quic_unref_client_id(c, cid);
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
479
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8910
diff changeset
480 return NGX_ERROR;
8748
e0cb1e58ca13 QUIC: separate files for connection id related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
481 }
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
482
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
483
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
484 ngx_int_t
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
485 ngx_quic_create_sockets(ngx_connection_t *c)
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
486 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
487 ngx_uint_t n;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
488 ngx_quic_socket_t *qsock;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
489 ngx_quic_connection_t *qc;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
490
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
491 qc = ngx_quic_get_connection(c);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
492
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
493 n = ngx_min(NGX_QUIC_MAX_SERVER_IDS, qc->ctp.active_connection_id_limit);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
494
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
495 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
496 "quic create sockets has:%ui max:%ui", qc->nsockets, n);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
497
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
498 while (qc->nsockets < n) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
499
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
500 qsock = ngx_quic_alloc_socket(c, qc);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
501 if (qsock == NULL) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
502 return NGX_ERROR;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
503 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
504
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
505 if (ngx_quic_listen(c, qc, qsock) != NGX_OK) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
506 return NGX_ERROR;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
507 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
508
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
509 if (ngx_quic_send_server_id(c, &qsock->sid) != NGX_OK) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
510 return NGX_ERROR;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
511 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
512 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
513
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
514 return NGX_OK;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
515 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
516
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
517
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
518 static ngx_int_t
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
519 ngx_quic_send_server_id(ngx_connection_t *c, ngx_quic_server_id_t *sid)
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
520 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
521 ngx_str_t dcid;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
522 ngx_quic_frame_t *frame;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
523 ngx_quic_connection_t *qc;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
524
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
525 qc = ngx_quic_get_connection(c);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
526
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
527 dcid.len = sid->len;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
528 dcid.data = sid->id;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
529
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
530 frame = ngx_quic_alloc_frame(c);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
531 if (frame == NULL) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
532 return NGX_ERROR;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
533 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
534
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
535 frame->level = ssl_encryption_application;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
536 frame->type = NGX_QUIC_FT_NEW_CONNECTION_ID;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
537 frame->u.ncid.seqnum = sid->seqnum;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
538 frame->u.ncid.retire = 0;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
539 frame->u.ncid.len = NGX_QUIC_SERVER_CID_LEN;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
540 ngx_memcpy(frame->u.ncid.cid, sid->id, NGX_QUIC_SERVER_CID_LEN);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
541
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
542 if (ngx_quic_new_sr_token(c, &dcid, qc->conf->sr_token_key,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
543 frame->u.ncid.srt)
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
544 != NGX_OK)
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
545 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
546 return NGX_ERROR;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
547 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
548
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
549 ngx_quic_queue_frame(qc, frame);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
550
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
551 return NGX_OK;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
552 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
553
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
554
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
555 static ngx_int_t
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
556 ngx_quic_replace_retired_client_id(ngx_connection_t *c,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
557 ngx_quic_client_id_t *retired_cid)
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
558 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
559 ngx_queue_t *q;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
560 ngx_quic_socket_t *qsock;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
561 ngx_quic_client_id_t *cid;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
562 ngx_quic_connection_t *qc;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
563
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
564 qc = ngx_quic_get_connection(c);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
565
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
566 for (q = ngx_queue_head(&qc->sockets);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
567 q != ngx_queue_sentinel(&qc->sockets);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
568 q = ngx_queue_next(q))
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
569 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
570 qsock = ngx_queue_data(q, ngx_quic_socket_t, queue);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
571
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
572 if (qsock->cid == retired_cid) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
573
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
574 cid = ngx_quic_next_client_id(c);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
575 if (cid == NULL) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
576 return NGX_ERROR;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
577 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
578
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
579 qsock->cid = cid;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
580 cid->refcnt++;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
581
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
582 ngx_quic_unref_client_id(c, retired_cid);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
583
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
584 if (retired_cid->refcnt == 0) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
585 return NGX_OK;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
586 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
587 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
588 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
589
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
590 return NGX_OK;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
591 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
592
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
593
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
594 void
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
595 ngx_quic_unref_client_id(ngx_connection_t *c, ngx_quic_client_id_t *cid)
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
596 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
597 ngx_quic_connection_t *qc;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
598
8896
e2ec952dc295 QUIC: fixed removal of unused client IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8797
diff changeset
599 if (cid->refcnt) {
e2ec952dc295 QUIC: fixed removal of unused client IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8797
diff changeset
600 cid->refcnt--;
e2ec952dc295 QUIC: fixed removal of unused client IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8797
diff changeset
601 } /* else: unused client id */
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
602
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
603 if (cid->refcnt) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
604 return;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
605 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
606
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
607 qc = ngx_quic_get_connection(c);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
608
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
609 ngx_queue_remove(&cid->queue);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
610 ngx_queue_insert_head(&qc->free_client_ids, &cid->queue);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
611
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
612 qc->nclient_ids--;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8748
diff changeset
613 }