changeset 8397:1245e274b9ba quic

Avoided excessive definitions for connection state. There is no need in a separate type for the QUIC connection state. The only state not found in the SSL library is NGX_QUIC_ST_UNAVAILABLE, which is actually a flag used by the ngx_quic_close_quic() function to prevent cleanup of uninitialized connection.
author Vladimir Homutov <vl@nginx.com>
date Thu, 21 May 2020 15:38:52 +0300
parents 94c06fe6e159
children 8bec0ac23cf9
files src/event/ngx_event_quic.c
diffstat 1 files changed, 13 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- a/src/event/ngx_event_quic.c
+++ b/src/event/ngx_event_quic.c
@@ -33,15 +33,6 @@
 #define NGX_QUIC_MAX_BUFFERED    65535
 
 
-typedef enum {
-    NGX_QUIC_ST_UNAVAIL,     /* connection not ready */
-    NGX_QUIC_ST_INITIAL,     /* connection just created */
-    NGX_QUIC_ST_HANDSHAKE,   /* handshake started */
-    NGX_QUIC_ST_EARLY_DATA,  /* handshake in progress */
-    NGX_QUIC_ST_APPLICATION  /* handshake complete */
-} ngx_quic_state_t;
-
-
 typedef struct {
     ngx_rbtree_t                      tree;
     ngx_rbtree_node_t                 sentinel;
@@ -95,7 +86,7 @@ struct ngx_quic_connection_s {
     ngx_quic_tp_t                     tp;
     ngx_quic_tp_t                     ctp;
 
-    ngx_quic_state_t                  state;
+    enum ssl_encryption_level_t       state;
 
     ngx_quic_send_ctx_t               send_ctx[NGX_QUIC_SEND_CTX_LAST];
     ngx_quic_secrets_t                keys[NGX_QUIC_ENCRYPTION_LAST];
@@ -127,6 +118,7 @@ struct ngx_quic_connection_s {
     unsigned                          draining:1;
     unsigned                          key_phase:1;
     unsigned                          in_retry:1;
+    unsigned                          initialized:1;
 };
 
 
@@ -297,7 +289,7 @@ ngx_quic_set_read_secret(ngx_ssl_conn_t 
     keys = &c->quic->keys[level];
 
     if (level == ssl_encryption_early_data) {
-        c->quic->state = NGX_QUIC_ST_EARLY_DATA;
+        c->quic->state = ssl_encryption_early_data;
     }
 
     return ngx_quic_set_encryption_secret(c->pool, ssl_conn, level,
@@ -358,7 +350,7 @@ ngx_quic_set_encryption_secrets(ngx_ssl_
     }
 
     if (level == ssl_encryption_early_data) {
-        c->quic->state = NGX_QUIC_ST_EARLY_DATA;
+        c->quic->state = ssl_encryption_early_data;
         return 1;
     }
 
@@ -620,7 +612,7 @@ ngx_quic_new_connection(ngx_connection_t
     qc->push.cancelable = 1;
 
     c->quic = qc;
-    qc->state = NGX_QUIC_ST_UNAVAIL;
+    qc->state = ssl_encryption_initial;
     qc->ssl = ssl;
     qc->tp = *tp;
     qc->streams.handler = handler;
@@ -657,7 +649,7 @@ ngx_quic_new_connection(ngx_connection_t
         return NGX_ERROR;
     }
 
-    qc->state = NGX_QUIC_ST_INITIAL;
+    qc->initialized = 1;
 
     if (pkt->token.len) {
         rc = ngx_quic_validate_token(c, pkt);
@@ -1066,7 +1058,7 @@ ngx_quic_init_connection(ngx_connection_
     }
 
     qc->max_streams = qc->tp.initial_max_streams_bidi;
-    qc->state = NGX_QUIC_ST_HANDSHAKE;
+    qc->state = ssl_encryption_handshake;
 
     return NGX_OK;
 }
@@ -1139,7 +1131,7 @@ ngx_quic_close_connection(ngx_connection
     ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
                    "quic ngx_quic_close_connection, rc: %i", rc);
 
-    if (!c->quic || c->quic->state == NGX_QUIC_ST_UNAVAIL) {
+    if (!c->quic || !c->quic->initialized) {
         ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
                       "quic close connection early error");
 
@@ -1180,19 +1172,9 @@ ngx_quic_close_quic(ngx_connection_t *c,
 
     if (!qc->closing) {
 
-        switch (qc->state) {
-        case NGX_QUIC_ST_INITIAL:
-            level = ssl_encryption_initial;
-            break;
-
-        case NGX_QUIC_ST_HANDSHAKE:
-            level = ssl_encryption_handshake;
-            break;
-
-        default: /* NGX_QUIC_ST_APPLICATION/EARLY_DATA */
-            level = ssl_encryption_application;
-            break;
-        }
+        level = (qc->state == ssl_encryption_early_data)
+                ? ssl_encryption_application
+                : qc->state;
 
         if (rc == NGX_OK) {
 
@@ -1639,7 +1621,7 @@ ngx_quic_early_input(ngx_connection_t *c
         return NGX_ERROR;
     }
 
-    if (c->quic->state != NGX_QUIC_ST_EARLY_DATA) {
+    if (c->quic->state != ssl_encryption_early_data) {
         ngx_log_error(NGX_LOG_INFO, c->log, 0, "quic unexpected 0-RTT packet");
         return NGX_OK;
     }
@@ -2480,7 +2462,7 @@ ngx_quic_crypto_input(ngx_connection_t *
         }
 
     } else if (n == 1 && !SSL_in_init(ssl_conn)) {
-        c->quic->state = NGX_QUIC_ST_APPLICATION;
+        c->quic->state = ssl_encryption_application;
 
         ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
                        "quic ssl cipher: %s", SSL_get_cipher(ssl_conn));