Mercurial > hg > nginx
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 Fri May 22 18:22:00 2020 +0300 +++ b/src/event/ngx_event_quic.c Thu May 21 15:38:52 2020 +0300 @@ -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 @@ 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 @@ unsigned draining:1; unsigned key_phase:1; unsigned in_retry:1; + unsigned initialized:1; }; @@ -297,7 +289,7 @@ 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 @@ } 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 @@ 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 @@ 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 @@ } 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_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 @@ 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 @@ 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 @@ } } 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));