diff 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
line wrap: on
line diff
--- a/src/event/quic/ngx_event_quic_connection.h
+++ b/src/event/quic/ngx_event_quic_connection.h
@@ -12,7 +12,11 @@
 #include <ngx_event.h>
 
 typedef struct ngx_quic_connection_s  ngx_quic_connection_t;
+typedef struct ngx_quic_server_id_s   ngx_quic_server_id_t;
+typedef struct ngx_quic_client_id_s   ngx_quic_client_id_t;
 typedef struct ngx_quic_send_ctx_s    ngx_quic_send_ctx_t;
+typedef struct ngx_quic_socket_s      ngx_quic_socket_t;
+typedef struct ngx_quic_path_s        ngx_quic_path_t;
 typedef struct ngx_quic_keys_s        ngx_quic_keys_t;
 
 #include <ngx_event_quic_transport.h>
@@ -25,6 +29,7 @@ typedef struct ngx_quic_keys_s        ng
 #include <ngx_event_quic_tokens.h>
 #include <ngx_event_quic_ack.h>
 #include <ngx_event_quic_output.h>
+#include <ngx_event_quic_socket.h>
 
 
 /* quic-recovery, section 6.2.2, kInitialRtt */
@@ -47,26 +52,57 @@ typedef struct ngx_quic_keys_s        ng
                                                  : &((qc)->send_ctx[2]))
 
 #define ngx_quic_get_connection(c)                                            \
-    (((c)->udp) ? (((ngx_quic_server_id_t *)((c)->udp))->quic) : NULL)
+    (((c)->udp) ? (((ngx_quic_socket_t *)((c)->udp))->quic) : NULL)
+
+#define ngx_quic_get_socket(c)               ((ngx_quic_socket_t *)((c)->udp))
 
 
-typedef struct {
+struct ngx_quic_client_id_s {
     ngx_queue_t                       queue;
     uint64_t                          seqnum;
     size_t                            len;
     u_char                            id[NGX_QUIC_CID_LEN_MAX];
     u_char                            sr_token[NGX_QUIC_SR_TOKEN_LEN];
-} ngx_quic_client_id_t;
+    ngx_uint_t                        refcnt;
+};
+
+
+struct ngx_quic_server_id_s {
+    uint64_t                          seqnum;
+    size_t                            len;
+    u_char                            id[NGX_QUIC_CID_LEN_MAX];
+};
 
 
-typedef struct {
+struct ngx_quic_path_s {
+    ngx_queue_t                       queue;
+    struct sockaddr                  *sockaddr;
+    socklen_t                         socklen;
+    ngx_uint_t                        state;
+    ngx_msec_t                        expires;
+    ngx_uint_t                        tries;
+    off_t                             sent;
+    off_t                             received;
+    u_char                            challenge1[8];
+    u_char                            challenge2[8];
+    ngx_uint_t                        refcnt;
+    uint64_t                          seqnum;
+    time_t                            validated_at;
+    ngx_str_t                         addr_text;
+    u_char                            text[NGX_SOCKADDR_STRLEN];
+};
+
+
+struct ngx_quic_socket_s {
     ngx_udp_connection_t              udp;
     ngx_quic_connection_t            *quic;
     ngx_queue_t                       queue;
-    uint64_t                          seqnum;
-    size_t                            len;
-    u_char                            id[NGX_QUIC_CID_LEN_MAX];
-} ngx_quic_server_id_t;
+
+    ngx_quic_server_id_t              sid;
+
+    ngx_quic_path_t                  *path;
+    ngx_quic_client_id_t             *cid;
+};
 
 
 typedef struct {
@@ -138,22 +174,22 @@ struct ngx_quic_send_ctx_s {
 struct ngx_quic_connection_s {
     uint32_t                          version;
 
-    ngx_str_t                         scid;  /* initial client ID */
-    ngx_str_t                         dcid;  /* server (our own) ID */
-    ngx_str_t                         odcid; /* original server ID */
-
-    struct sockaddr                  *sockaddr;
-    socklen_t                         socklen;
+    ngx_quic_socket_t                *socket;
+    ngx_quic_socket_t                *backup;
 
+    ngx_queue_t                       sockets;
+    ngx_queue_t                       paths;
     ngx_queue_t                       client_ids;
-    ngx_queue_t                       server_ids;
+    ngx_queue_t                       free_sockets;
+    ngx_queue_t                       free_paths;
     ngx_queue_t                       free_client_ids;
-    ngx_queue_t                       free_server_ids;
+
+    ngx_uint_t                        nsockets;
     ngx_uint_t                        nclient_ids;
-    ngx_uint_t                        nserver_ids;
     uint64_t                          max_retired_seqnum;
     uint64_t                          client_seqnum;
     uint64_t                          server_seqnum;
+    uint64_t                          path_seqnum;
 
     ngx_uint_t                        client_tp_done;
     ngx_quic_tp_t                     tp;
@@ -170,6 +206,7 @@ struct ngx_quic_connection_s {
     ngx_event_t                       push;
     ngx_event_t                       pto;
     ngx_event_t                       close;
+    ngx_event_t                       path_validation;
     ngx_msec_t                        last_cc;
 
     ngx_msec_t                        latest_rtt;
@@ -190,7 +227,6 @@ struct ngx_quic_connection_s {
 
     ngx_quic_streams_t                streams;
     ngx_quic_congestion_t             congestion;
-    off_t                             received;
 
     ngx_uint_t                        error;
     enum ssl_encryption_level_t       error_level;