annotate src/event/quic/ngx_event_quic_socket.c @ 8782:b3f6ad181df4 quic

QUIC: refactored CRYPTO and STREAM buffer ordering. Generic function ngx_quic_order_bufs() is introduced. This function creates and maintains a chain of buffers with holes. Holes are marked with b->sync flag. Several buffers and holes in this chain may share the same underlying memory buffer. When processing STREAM frames with this function, frame data is copied only once to the right place in the stream input chain. Previously data could be copied twice. First when buffering an out-of-order frame data, and then when filling stream buffer from ordered frame queue. Now there's only one data chain for both tasks.
author Roman Arutyunyan <arut@nginx.com>
date Tue, 25 May 2021 13:55:12 +0300
parents 4117aa7fa38e
children 6d1488b62dc5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
2 /*
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
3 * Copyright (C) Nginx, Inc.
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
4 */
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
5
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
6
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
7 #include <ngx_config.h>
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
8 #include <ngx_core.h>
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
9 #include <ngx_event.h>
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
10 #include <ngx_event_quic_connection.h>
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
11
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
12
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
13 static ngx_int_t ngx_quic_create_temp_socket(ngx_connection_t *c,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
14 ngx_quic_connection_t *qc, ngx_str_t *dcid, ngx_quic_path_t *path,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
15 ngx_quic_client_id_t *cid);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
16
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
17 static void ngx_quic_unref_path(ngx_connection_t *c, ngx_quic_path_t *path);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
18
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
19
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
20 ngx_int_t
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
21 ngx_quic_open_sockets(ngx_connection_t *c, ngx_quic_connection_t *qc,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
22 ngx_quic_header_t *pkt)
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
23 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
24 ngx_quic_path_t *path;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
25 ngx_quic_socket_t *qsock;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
26 ngx_quic_client_id_t *cid;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
27
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
28 /*
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
29 * qc->nclient_ids = 0
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
30 * qc->nsockets = 0
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
31 * qc->max_retired_seqnum = 0
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
32 * qc->client_seqnum = 0
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
33 */
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
34
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
35 ngx_queue_init(&qc->sockets);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
36 ngx_queue_init(&qc->free_sockets);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
37
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
38 ngx_queue_init(&qc->paths);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
39 ngx_queue_init(&qc->free_paths);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
40
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
41 ngx_queue_init(&qc->client_ids);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
42 ngx_queue_init(&qc->free_client_ids);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
43
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
44 qc->tp.original_dcid.len = pkt->odcid.len;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
45 qc->tp.original_dcid.data = ngx_pstrdup(c->pool, &pkt->odcid);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
46 if (qc->tp.original_dcid.data == NULL) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
47 return NGX_ERROR;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
48 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
49
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
50 /* socket to use for further processing */
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
51 qsock = ngx_quic_alloc_socket(c, qc);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
52 if (qsock == NULL) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
53 return NGX_ERROR;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
54 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
55
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
56 /* socket is listening at new server id (autogenerated) */
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
57 if (ngx_quic_listen(c, qc, qsock) != NGX_OK) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
58 return NGX_ERROR;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
59 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
60
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
61 qc->tp.initial_scid.len = qsock->sid.len;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
62 qc->tp.initial_scid.data = ngx_pnalloc(c->pool, qsock->sid.len);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
63 if (qc->tp.initial_scid.data == NULL) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
64 goto failed;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
65 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
66 ngx_memcpy(qc->tp.initial_scid.data, qsock->sid.id, qsock->sid.len);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
67
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
68 /* for all packets except first, this is set at udp layer */
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
69 c->udp = &qsock->udp;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
70
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
71 /* ngx_quic_get_connection(c) macro is now usable */
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
72
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
73 /* we have a client identified by scid */
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
74 cid = ngx_quic_create_client_id(c, &pkt->scid, 0, NULL);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
75 if (cid == NULL) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
76 goto failed;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
77 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
78
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
79 /* the client arrived from this path */
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
80 path = ngx_quic_add_path(c, c->sockaddr, c->socklen);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
81 if (path == NULL) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
82 goto failed;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
83 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
84
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
85 if (pkt->validated) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
86 path->state = NGX_QUIC_PATH_VALIDATED;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
87 path->validated_at = ngx_time();
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
88 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
89
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
90 /* now bind socket to client and path */
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
91 ngx_quic_connect(c, qsock, path, cid);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
92
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
93 if (ngx_quic_create_temp_socket(c, qc, &pkt->odcid, path, cid) != NGX_OK) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
94 goto failed;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
95 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
96
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
97 /* use this socket as default destination */
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
98 qc->socket = qsock;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
99
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
100 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
101 "quic active socket is #%uL:%uL:%uL (%s)",
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
102 qsock->sid.seqnum, qsock->cid->seqnum, qsock->path->seqnum,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
103 ngx_quic_path_state_str(qsock->path));
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
104
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
105 return NGX_OK;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
106
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
107 failed:
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
108
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
109 ngx_rbtree_delete(&c->listening->rbtree, &qsock->udp.node);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
110 c->udp = NULL;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
111
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
112 return NGX_ERROR;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
113 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
114
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
115
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
116 static ngx_int_t
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
117 ngx_quic_create_temp_socket(ngx_connection_t *c, ngx_quic_connection_t *qc,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
118 ngx_str_t *dcid, ngx_quic_path_t *path, ngx_quic_client_id_t *cid)
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
119 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
120 ngx_str_t id;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
121 ngx_quic_socket_t *qsock;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
122 ngx_quic_server_id_t *sid;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
123
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
124 qsock = ngx_quic_alloc_socket(c, qc);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
125 if (qsock == NULL) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
126 return NGX_ERROR;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
127 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
128
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
129 sid = &qsock->sid;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
130
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
131 sid->seqnum = NGX_QUIC_UNSET_PN; /* mark socket as temporary */
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
132
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
133 sid->len = dcid->len;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
134 ngx_memcpy(sid->id, dcid->data, dcid->len);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
135
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
136 id.len = sid->len;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
137 id.data = sid->id;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
138
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
139 ngx_insert_udp_connection(c, &qsock->udp, &id);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
140
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
141 ngx_queue_insert_tail(&qc->sockets, &qsock->queue);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
142
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
143 qc->nsockets++;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
144 qsock->quic = qc;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
145
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
146 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
147 "quic socket #%L listening at sid:%xV nsock:%ui",
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
148 (int64_t) sid->seqnum, &id, qc->nsockets);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
149
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
150 ngx_quic_connect(c, qsock, path, cid);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
151
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
152 return NGX_OK;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
153 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
154
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
155
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
156 ngx_quic_socket_t *
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
157 ngx_quic_alloc_socket(ngx_connection_t *c, ngx_quic_connection_t *qc)
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
158 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
159 ngx_queue_t *q;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
160 ngx_quic_socket_t *sock;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
161
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
162 if (!ngx_queue_empty(&qc->free_sockets)) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
163
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
164 q = ngx_queue_head(&qc->free_sockets);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
165 sock = ngx_queue_data(q, ngx_quic_socket_t, queue);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
166
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
167 ngx_queue_remove(&sock->queue);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
168
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
169 ngx_memzero(sock, sizeof(ngx_quic_socket_t));
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
170
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
171 } else {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
172
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
173 sock = ngx_pcalloc(c->pool, sizeof(ngx_quic_socket_t));
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
174 if (sock == NULL) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
175 return NULL;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
176 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
177 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
178
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
179 return sock;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
180 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
181
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
182
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
183 void
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
184 ngx_quic_close_socket(ngx_connection_t *c, ngx_quic_socket_t *qsock)
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
185 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
186 ngx_quic_connection_t *qc;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
187
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
188 qc = ngx_quic_get_connection(c);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
189
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
190 ngx_queue_remove(&qsock->queue);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
191 ngx_queue_insert_head(&qc->free_sockets, &qsock->queue);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
192
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
193 ngx_rbtree_delete(&c->listening->rbtree, &qsock->udp.node);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
194 qc->nsockets--;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
195
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
196 if (qsock->path) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
197 ngx_quic_unref_path(c, qsock->path);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
198 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
199
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
200 if (qsock->cid) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
201 ngx_quic_unref_client_id(c, qsock->cid);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
202 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
203
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
204 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
205 "quic socket #%L closed nsock:%ui",
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
206 (int64_t) qsock->sid.seqnum, qc->nsockets);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
207 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
208
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
209
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
210 static void
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
211 ngx_quic_unref_path(ngx_connection_t *c, ngx_quic_path_t *path)
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
212 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
213 ngx_quic_connection_t *qc;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
214
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
215 path->refcnt--;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
216
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
217 if (path->refcnt) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
218 return;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
219 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
220
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
221 qc = ngx_quic_get_connection(c);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
222
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
223 ngx_queue_remove(&path->queue);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
224 ngx_queue_insert_head(&qc->free_paths, &path->queue);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
225
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
226 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
227 "quic path #%uL addr:%V removed",
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
228 path->seqnum, &path->addr_text);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
229 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
230
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
231
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
232 ngx_int_t
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
233 ngx_quic_listen(ngx_connection_t *c, ngx_quic_connection_t *qc,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
234 ngx_quic_socket_t *qsock)
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
235 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
236 ngx_str_t id;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
237 ngx_quic_server_id_t *sid;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
238
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
239 sid = &qsock->sid;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
240
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
241 sid->len = NGX_QUIC_SERVER_CID_LEN;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
242
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
243 if (ngx_quic_create_server_id(c, sid->id) != NGX_OK) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
244 return NGX_ERROR;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
245 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
246
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
247 sid->seqnum = qc->server_seqnum++;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
248
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
249 id.data = sid->id;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
250 id.len = sid->len;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
251
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
252 ngx_insert_udp_connection(c, &qsock->udp, &id);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
253
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
254 ngx_queue_insert_tail(&qc->sockets, &qsock->queue);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
255
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
256 qc->nsockets++;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
257 qsock->quic = qc;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
258
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
259 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
260 "quic socket #%uL listening at sid:%xV nsock:%ui",
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
261 sid->seqnum, &id, qc->nsockets);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
262
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
263 return NGX_OK;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
264 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
265
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
266
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
267 void
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
268 ngx_quic_connect(ngx_connection_t *c, ngx_quic_socket_t *sock,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
269 ngx_quic_path_t *path, ngx_quic_client_id_t *cid)
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
270 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
271 sock->path = path;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
272 path->refcnt++;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
273
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
274 sock->cid = cid;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
275 cid->refcnt++;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
276
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
277 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
278 "quic socket #%L connected to cid #%uL path:%uL",
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
279 (int64_t) sock->sid.seqnum,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
280 sock->cid->seqnum, path->seqnum);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
281 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
282
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
283
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
284 void
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
285 ngx_quic_close_sockets(ngx_connection_t *c)
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
286 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
287 ngx_queue_t *q;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
288 ngx_quic_socket_t *qsock;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
289 ngx_quic_connection_t *qc;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
290
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
291 qc = ngx_quic_get_connection(c);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
292
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
293 ngx_quic_close_socket(c, qc->socket);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
294
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
295 if (qc->backup) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
296 ngx_quic_close_socket(c, qc->backup);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
297 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
298
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
299 while (!ngx_queue_empty(&qc->sockets)) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
300 q = ngx_queue_head(&qc->sockets);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
301 qsock = ngx_queue_data(q, ngx_quic_socket_t, queue);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
302
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
303 ngx_quic_close_socket(c, qsock);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
304 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
305 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
306
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
307
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
308 ngx_quic_socket_t *
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
309 ngx_quic_find_socket(ngx_connection_t *c, uint64_t seqnum)
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
310 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
311 ngx_queue_t *q;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
312 ngx_quic_socket_t *qsock;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
313 ngx_quic_connection_t *qc;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
314
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
315 qc = ngx_quic_get_connection(c);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
316
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
317 for (q = ngx_queue_head(&qc->sockets);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
318 q != ngx_queue_sentinel(&qc->sockets);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
319 q = ngx_queue_next(q))
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
320 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
321 qsock = ngx_queue_data(q, ngx_quic_socket_t, queue);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
322
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
323 if (qsock->sid.seqnum == seqnum) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
324 return qsock;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
325 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
326 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
327
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
328 return NULL;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
329 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
330
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
331
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
332 ngx_quic_socket_t *
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
333 ngx_quic_get_unconnected_socket(ngx_connection_t *c)
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
334 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
335 ngx_queue_t *q;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
336 ngx_quic_socket_t *sock;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
337 ngx_quic_connection_t *qc;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
338
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
339 qc = ngx_quic_get_connection(c);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
340
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
341 for (q = ngx_queue_head(&qc->sockets);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
342 q != ngx_queue_sentinel(&qc->sockets);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
343 q = ngx_queue_next(q))
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
344 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
345 sock = ngx_queue_data(q, ngx_quic_socket_t, queue);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
346
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
347 if (sock->cid == NULL) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
348 return sock;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
349 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
350 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
351
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
352 return NULL;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
353 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
354
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
355