Mercurial > hg > nginx-quic
comparison src/event/quic/ngx_event_quic_connection.h @ 8423: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
8422:12f18e0bca09 | 8423: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; |