comparison src/event/quic/ngx_event_quic_connection.h @ 8763:4117aa7fa38e quic

QUIC: connection migration. The patch adds proper transitions between multiple networking addresses that can be used by a single quic connection. New networking paths are validated using PATH_CHALLENGE/PATH_RESPONSE frames.
author Vladimir Homutov <vl@nginx.com>
date Thu, 29 Apr 2021 15:35:02 +0300
parents b4e6b7049984
children 0bd1dd39a08b
comparison
equal deleted inserted replaced
8762:12f18e0bca09 8763:4117aa7fa38e
10 #include <ngx_config.h> 10 #include <ngx_config.h>
11 #include <ngx_core.h> 11 #include <ngx_core.h>
12 #include <ngx_event.h> 12 #include <ngx_event.h>
13 13
14 typedef struct ngx_quic_connection_s ngx_quic_connection_t; 14 typedef struct ngx_quic_connection_s ngx_quic_connection_t;
15 typedef struct ngx_quic_server_id_s ngx_quic_server_id_t;
16 typedef struct ngx_quic_client_id_s ngx_quic_client_id_t;
15 typedef struct ngx_quic_send_ctx_s ngx_quic_send_ctx_t; 17 typedef struct ngx_quic_send_ctx_s ngx_quic_send_ctx_t;
18 typedef struct ngx_quic_socket_s ngx_quic_socket_t;
19 typedef struct ngx_quic_path_s ngx_quic_path_t;
16 typedef struct ngx_quic_keys_s ngx_quic_keys_t; 20 typedef struct ngx_quic_keys_s ngx_quic_keys_t;
17 21
18 #include <ngx_event_quic_transport.h> 22 #include <ngx_event_quic_transport.h>
19 #include <ngx_event_quic_protection.h> 23 #include <ngx_event_quic_protection.h>
20 #include <ngx_event_quic_frames.h> 24 #include <ngx_event_quic_frames.h>
23 #include <ngx_event_quic_streams.h> 27 #include <ngx_event_quic_streams.h>
24 #include <ngx_event_quic_ssl.h> 28 #include <ngx_event_quic_ssl.h>
25 #include <ngx_event_quic_tokens.h> 29 #include <ngx_event_quic_tokens.h>
26 #include <ngx_event_quic_ack.h> 30 #include <ngx_event_quic_ack.h>
27 #include <ngx_event_quic_output.h> 31 #include <ngx_event_quic_output.h>
32 #include <ngx_event_quic_socket.h>
28 33
29 34
30 /* quic-recovery, section 6.2.2, kInitialRtt */ 35 /* quic-recovery, section 6.2.2, kInitialRtt */
31 #define NGX_QUIC_INITIAL_RTT 333 /* ms */ 36 #define NGX_QUIC_INITIAL_RTT 333 /* ms */
32 37
45 ((level) == ssl_encryption_initial) ? &((qc)->send_ctx[0]) \ 50 ((level) == ssl_encryption_initial) ? &((qc)->send_ctx[0]) \
46 : (((level) == ssl_encryption_handshake) ? &((qc)->send_ctx[1]) \ 51 : (((level) == ssl_encryption_handshake) ? &((qc)->send_ctx[1]) \
47 : &((qc)->send_ctx[2])) 52 : &((qc)->send_ctx[2]))
48 53
49 #define ngx_quic_get_connection(c) \ 54 #define ngx_quic_get_connection(c) \
50 (((c)->udp) ? (((ngx_quic_server_id_t *)((c)->udp))->quic) : NULL) 55 (((c)->udp) ? (((ngx_quic_socket_t *)((c)->udp))->quic) : NULL)
51 56
52 57 #define ngx_quic_get_socket(c) ((ngx_quic_socket_t *)((c)->udp))
53 typedef struct { 58
59
60 struct ngx_quic_client_id_s {
54 ngx_queue_t queue; 61 ngx_queue_t queue;
55 uint64_t seqnum; 62 uint64_t seqnum;
56 size_t len; 63 size_t len;
57 u_char id[NGX_QUIC_CID_LEN_MAX]; 64 u_char id[NGX_QUIC_CID_LEN_MAX];
58 u_char sr_token[NGX_QUIC_SR_TOKEN_LEN]; 65 u_char sr_token[NGX_QUIC_SR_TOKEN_LEN];
59 } ngx_quic_client_id_t; 66 ngx_uint_t refcnt;
60 67 };
61 68
62 typedef struct { 69
70 struct ngx_quic_server_id_s {
71 uint64_t seqnum;
72 size_t len;
73 u_char id[NGX_QUIC_CID_LEN_MAX];
74 };
75
76
77 struct ngx_quic_path_s {
78 ngx_queue_t queue;
79 struct sockaddr *sockaddr;
80 socklen_t socklen;
81 ngx_uint_t state;
82 ngx_msec_t expires;
83 ngx_uint_t tries;
84 off_t sent;
85 off_t received;
86 u_char challenge1[8];
87 u_char challenge2[8];
88 ngx_uint_t refcnt;
89 uint64_t seqnum;
90 time_t validated_at;
91 ngx_str_t addr_text;
92 u_char text[NGX_SOCKADDR_STRLEN];
93 };
94
95
96 struct ngx_quic_socket_s {
63 ngx_udp_connection_t udp; 97 ngx_udp_connection_t udp;
64 ngx_quic_connection_t *quic; 98 ngx_quic_connection_t *quic;
65 ngx_queue_t queue; 99 ngx_queue_t queue;
66 uint64_t seqnum; 100
67 size_t len; 101 ngx_quic_server_id_t sid;
68 u_char id[NGX_QUIC_CID_LEN_MAX]; 102
69 } ngx_quic_server_id_t; 103 ngx_quic_path_t *path;
104 ngx_quic_client_id_t *cid;
105 };
70 106
71 107
72 typedef struct { 108 typedef struct {
73 ngx_rbtree_t tree; 109 ngx_rbtree_t tree;
74 ngx_rbtree_node_t sentinel; 110 ngx_rbtree_node_t sentinel;
136 172
137 173
138 struct ngx_quic_connection_s { 174 struct ngx_quic_connection_s {
139 uint32_t version; 175 uint32_t version;
140 176
141 ngx_str_t scid; /* initial client ID */ 177 ngx_quic_socket_t *socket;
142 ngx_str_t dcid; /* server (our own) ID */ 178 ngx_quic_socket_t *backup;
143 ngx_str_t odcid; /* original server ID */ 179
144 180 ngx_queue_t sockets;
145 struct sockaddr *sockaddr; 181 ngx_queue_t paths;
146 socklen_t socklen;
147
148 ngx_queue_t client_ids; 182 ngx_queue_t client_ids;
149 ngx_queue_t server_ids; 183 ngx_queue_t free_sockets;
184 ngx_queue_t free_paths;
150 ngx_queue_t free_client_ids; 185 ngx_queue_t free_client_ids;
151 ngx_queue_t free_server_ids; 186
187 ngx_uint_t nsockets;
152 ngx_uint_t nclient_ids; 188 ngx_uint_t nclient_ids;
153 ngx_uint_t nserver_ids;
154 uint64_t max_retired_seqnum; 189 uint64_t max_retired_seqnum;
155 uint64_t client_seqnum; 190 uint64_t client_seqnum;
156 uint64_t server_seqnum; 191 uint64_t server_seqnum;
192 uint64_t path_seqnum;
157 193
158 ngx_uint_t client_tp_done; 194 ngx_uint_t client_tp_done;
159 ngx_quic_tp_t tp; 195 ngx_quic_tp_t tp;
160 ngx_quic_tp_t ctp; 196 ngx_quic_tp_t ctp;
161 197
168 ngx_quic_conf_t *conf; 204 ngx_quic_conf_t *conf;
169 205
170 ngx_event_t push; 206 ngx_event_t push;
171 ngx_event_t pto; 207 ngx_event_t pto;
172 ngx_event_t close; 208 ngx_event_t close;
209 ngx_event_t path_validation;
173 ngx_msec_t last_cc; 210 ngx_msec_t last_cc;
174 211
175 ngx_msec_t latest_rtt; 212 ngx_msec_t latest_rtt;
176 ngx_msec_t avg_rtt; 213 ngx_msec_t avg_rtt;
177 ngx_msec_t min_rtt; 214 ngx_msec_t min_rtt;
188 ngx_uint_t nbufs; 225 ngx_uint_t nbufs;
189 #endif 226 #endif
190 227
191 ngx_quic_streams_t streams; 228 ngx_quic_streams_t streams;
192 ngx_quic_congestion_t congestion; 229 ngx_quic_congestion_t congestion;
193 off_t received;
194 230
195 ngx_uint_t error; 231 ngx_uint_t error;
196 enum ssl_encryption_level_t error_level; 232 enum ssl_encryption_level_t error_level;
197 ngx_uint_t error_ftype; 233 ngx_uint_t error_ftype;
198 const char *error_reason; 234 const char *error_reason;