annotate src/event/quic/ngx_event_quic_socket.c @ 8962:47f45a98f892 quic

QUIC: fixed handling STREAM FIN. Previously, when a STREAM FIN frame with no data bytes was received after all prior stream data were already read by the application layer, the frame was ignored and eof was not reported to the application.
author Roman Arutyunyan <arut@nginx.com>
date Tue, 11 Jan 2022 18:57:02 +0300
parents 32daba3aabb2
children 1e2f4e9c8195
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 ngx_int_t
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
14 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
15 ngx_quic_header_t *pkt)
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 ngx_quic_path_t *path;
8955
32daba3aabb2 QUIC: got rid of ngx_quic_create_temp_socket().
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
18 ngx_quic_socket_t *qsock, *tmp;
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
19 ngx_quic_client_id_t *cid;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
20
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
21 /*
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
22 * qc->nclient_ids = 0
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
23 * qc->nsockets = 0
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
24 * qc->max_retired_seqnum = 0
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
25 * qc->client_seqnum = 0
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
26 */
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 ngx_queue_init(&qc->sockets);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
29 ngx_queue_init(&qc->free_sockets);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
30
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
31 ngx_queue_init(&qc->paths);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
32 ngx_queue_init(&qc->free_paths);
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 ngx_queue_init(&qc->client_ids);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
35 ngx_queue_init(&qc->free_client_ids);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
36
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
37 qc->tp.original_dcid.len = pkt->odcid.len;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
38 qc->tp.original_dcid.data = ngx_pstrdup(c->pool, &pkt->odcid);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
39 if (qc->tp.original_dcid.data == NULL) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
40 return NGX_ERROR;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
41 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
42
8955
32daba3aabb2 QUIC: got rid of ngx_quic_create_temp_socket().
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
43 /* socket to use for further processing (id auto-generated) */
32daba3aabb2 QUIC: got rid of ngx_quic_create_temp_socket().
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
44 qsock = ngx_quic_create_socket(c, qc);
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
45 if (qsock == NULL) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
46 return NGX_ERROR;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
47 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
48
8955
32daba3aabb2 QUIC: got rid of ngx_quic_create_temp_socket().
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
49 /* socket is listening at new server id */
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
50 if (ngx_quic_listen(c, qc, qsock) != NGX_OK) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
51 return NGX_ERROR;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
52 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
53
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
54 qc->tp.initial_scid.len = qsock->sid.len;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
55 qc->tp.initial_scid.data = ngx_pnalloc(c->pool, qsock->sid.len);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
56 if (qc->tp.initial_scid.data == NULL) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
57 goto failed;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
58 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
59 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
60
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
61 /* for all packets except first, this is set at udp layer */
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
62 c->udp = &qsock->udp;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
63
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
64 /* ngx_quic_get_connection(c) macro is now usable */
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 /* we have a client identified by scid */
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
67 cid = ngx_quic_create_client_id(c, &pkt->scid, 0, NULL);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
68 if (cid == NULL) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
69 goto failed;
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
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
72 /* the client arrived from this path */
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
73 path = ngx_quic_add_path(c, c->sockaddr, c->socklen);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
74 if (path == NULL) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
75 goto failed;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
76 }
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 if (pkt->validated) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
79 path->state = NGX_QUIC_PATH_VALIDATED;
8940
fb41e37ddeb0 QUIC: decoupled path state and limitation status.
Vladimir Homutov <vl@nginx.com>
parents: 8939
diff changeset
80 path->limited = 0;
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
81 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
82
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
83 /* now bind socket to client and path */
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
84 ngx_quic_connect(c, qsock, path, cid);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
85
8955
32daba3aabb2 QUIC: got rid of ngx_quic_create_temp_socket().
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
86 tmp = ngx_pcalloc(c->pool, sizeof(ngx_quic_socket_t));
32daba3aabb2 QUIC: got rid of ngx_quic_create_temp_socket().
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
87 if (tmp == NULL) {
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
88 goto failed;
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
8955
32daba3aabb2 QUIC: got rid of ngx_quic_create_temp_socket().
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
91 tmp->sid.seqnum = NGX_QUIC_UNSET_PN; /* temporary socket */
32daba3aabb2 QUIC: got rid of ngx_quic_create_temp_socket().
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
92
32daba3aabb2 QUIC: got rid of ngx_quic_create_temp_socket().
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
93 ngx_memcpy(tmp->sid.id, pkt->odcid.data, pkt->odcid.len);
32daba3aabb2 QUIC: got rid of ngx_quic_create_temp_socket().
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
94 tmp->sid.len = pkt->odcid.len;
32daba3aabb2 QUIC: got rid of ngx_quic_create_temp_socket().
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
95
32daba3aabb2 QUIC: got rid of ngx_quic_create_temp_socket().
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
96 if (ngx_quic_listen(c, qc, tmp) != NGX_OK) {
32daba3aabb2 QUIC: got rid of ngx_quic_create_temp_socket().
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
97 goto failed;
32daba3aabb2 QUIC: got rid of ngx_quic_create_temp_socket().
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
98 }
32daba3aabb2 QUIC: got rid of ngx_quic_create_temp_socket().
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
99
32daba3aabb2 QUIC: got rid of ngx_quic_create_temp_socket().
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
100 ngx_quic_connect(c, tmp, path, cid);
32daba3aabb2 QUIC: got rid of ngx_quic_create_temp_socket().
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
101
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
102 /* use this socket as default destination */
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
103 qc->socket = qsock;
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 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
106 "quic active socket is #%uL:%uL:%uL (%s)",
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
107 qsock->sid.seqnum, qsock->cid->seqnum, qsock->path->seqnum,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
108 ngx_quic_path_state_str(qsock->path));
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
109
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
110 return NGX_OK;
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 failed:
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 ngx_rbtree_delete(&c->listening->rbtree, &qsock->udp.node);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
115 c->udp = NULL;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
116
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
117 return NGX_ERROR;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
118 }
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
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
121 ngx_quic_socket_t *
8955
32daba3aabb2 QUIC: got rid of ngx_quic_create_temp_socket().
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
122 ngx_quic_create_socket(ngx_connection_t *c, ngx_quic_connection_t *qc)
8763
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 ngx_queue_t *q;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
125 ngx_quic_socket_t *sock;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
126
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
127 if (!ngx_queue_empty(&qc->free_sockets)) {
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 q = ngx_queue_head(&qc->free_sockets);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
130 sock = ngx_queue_data(q, ngx_quic_socket_t, queue);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
131
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
132 ngx_queue_remove(&sock->queue);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
133
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
134 ngx_memzero(sock, sizeof(ngx_quic_socket_t));
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 } else {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
137
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
138 sock = ngx_pcalloc(c->pool, sizeof(ngx_quic_socket_t));
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
139 if (sock == NULL) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
140 return NULL;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
141 }
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
8955
32daba3aabb2 QUIC: got rid of ngx_quic_create_temp_socket().
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
144 sock->sid.len = NGX_QUIC_SERVER_CID_LEN;
32daba3aabb2 QUIC: got rid of ngx_quic_create_temp_socket().
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
145 if (ngx_quic_create_server_id(c, sock->sid.id) != NGX_OK) {
32daba3aabb2 QUIC: got rid of ngx_quic_create_temp_socket().
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
146 return NULL;
32daba3aabb2 QUIC: got rid of ngx_quic_create_temp_socket().
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
147 }
32daba3aabb2 QUIC: got rid of ngx_quic_create_temp_socket().
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
148
32daba3aabb2 QUIC: got rid of ngx_quic_create_temp_socket().
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
149 sock->sid.seqnum = qc->server_seqnum++;
32daba3aabb2 QUIC: got rid of ngx_quic_create_temp_socket().
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
150
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
151 return sock;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
152 }
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 void
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
156 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
157 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
158 ngx_quic_connection_t *qc;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
159
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
160 qc = ngx_quic_get_connection(c);
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 ngx_queue_remove(&qsock->queue);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
163 ngx_queue_insert_head(&qc->free_sockets, &qsock->queue);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
164
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
165 ngx_rbtree_delete(&c->listening->rbtree, &qsock->udp.node);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
166 qc->nsockets--;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
167
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
168 if (qsock->path) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
169 ngx_quic_unref_path(c, qsock->path);
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
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
172 if (qsock->cid) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
173 ngx_quic_unref_client_id(c, qsock->cid);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
174 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
175
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
176 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
177 "quic socket #%L closed nsock:%ui",
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
178 (int64_t) qsock->sid.seqnum, qc->nsockets);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
179 }
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
8911
b09f055daa4e QUIC: fixed handling of RETIRE_CONNECTION_ID frame.
Vladimir Homutov <vl@nginx.com>
parents: 8888
diff changeset
182 void
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
183 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
184 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
185 ngx_quic_connection_t *qc;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
186
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
187 path->refcnt--;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
188
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
189 if (path->refcnt) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
190 return;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
191 }
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 qc = ngx_quic_get_connection(c);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
194
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
195 ngx_queue_remove(&path->queue);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
196 ngx_queue_insert_head(&qc->free_paths, &path->queue);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
197
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
198 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
199 "quic path #%uL addr:%V removed",
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
200 path->seqnum, &path->addr_text);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
201 }
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_int_t
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
205 ngx_quic_listen(ngx_connection_t *c, ngx_quic_connection_t *qc,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
206 ngx_quic_socket_t *qsock)
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 ngx_str_t id;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
209 ngx_quic_server_id_t *sid;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
210
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
211 sid = &qsock->sid;
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 id.data = sid->id;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
214 id.len = sid->len;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
215
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
216 ngx_insert_udp_connection(c, &qsock->udp, &id);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
217
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
218 ngx_queue_insert_tail(&qc->sockets, &qsock->queue);
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 qc->nsockets++;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
221 qsock->quic = qc;
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_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
8955
32daba3aabb2 QUIC: got rid of ngx_quic_create_temp_socket().
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
224 "quic socket #%L listening at sid:%xV nsock:%ui",
32daba3aabb2 QUIC: got rid of ngx_quic_create_temp_socket().
Vladimir Homutov <vl@nginx.com>
parents: 8940
diff changeset
225 (int64_t) sid->seqnum, &id, qc->nsockets);
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
226
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
227 return NGX_OK;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
228 }
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 void
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
232 ngx_quic_connect(ngx_connection_t *c, ngx_quic_socket_t *sock,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
233 ngx_quic_path_t *path, ngx_quic_client_id_t *cid)
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
234 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
235 sock->path = path;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
236 path->refcnt++;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
237
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
238 sock->cid = cid;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
239 cid->refcnt++;
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 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
242 "quic socket #%L connected to cid #%uL path:%uL",
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
243 (int64_t) sock->sid.seqnum,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
244 sock->cid->seqnum, path->seqnum);
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
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
248 void
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
249 ngx_quic_close_sockets(ngx_connection_t *c)
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
250 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
251 ngx_queue_t *q;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
252 ngx_quic_socket_t *qsock;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
253 ngx_quic_connection_t *qc;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
254
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
255 qc = ngx_quic_get_connection(c);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
256
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
257 while (!ngx_queue_empty(&qc->sockets)) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
258 q = ngx_queue_head(&qc->sockets);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
259 qsock = ngx_queue_data(q, ngx_quic_socket_t, queue);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
260
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
261 ngx_quic_close_socket(c, qsock);
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 }
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 ngx_quic_socket_t *
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
267 ngx_quic_find_socket(ngx_connection_t *c, uint64_t seqnum)
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
268 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
269 ngx_queue_t *q;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
270 ngx_quic_socket_t *qsock;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
271 ngx_quic_connection_t *qc;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
272
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
273 qc = ngx_quic_get_connection(c);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
274
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
275 for (q = ngx_queue_head(&qc->sockets);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
276 q != ngx_queue_sentinel(&qc->sockets);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
277 q = ngx_queue_next(q))
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
278 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
279 qsock = ngx_queue_data(q, ngx_quic_socket_t, queue);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
280
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
281 if (qsock->sid.seqnum == seqnum) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
282 return qsock;
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 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
285
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
286 return NULL;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
287 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
288
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
289
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
290 ngx_quic_socket_t *
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
291 ngx_quic_get_unconnected_socket(ngx_connection_t *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_queue_t *q;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
294 ngx_quic_socket_t *sock;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
295 ngx_quic_connection_t *qc;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
296
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
297 qc = ngx_quic_get_connection(c);
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 for (q = ngx_queue_head(&qc->sockets);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
300 q != ngx_queue_sentinel(&qc->sockets);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
301 q = ngx_queue_next(q))
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 sock = ngx_queue_data(q, ngx_quic_socket_t, queue);
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 if (sock->cid == NULL) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
306 return sock;
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 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
309
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
310 return NULL;
8888
6d1488b62dc5 QUIC: style.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8763
diff changeset
311 }