changeset 8892:d8ac4d3c24ac quic

QUIC: added function to initialize packet.
author Vladimir Homutov <vl@nginx.com>
date Thu, 30 Sep 2021 12:02:29 +0300
parents c5155a0cb12f
children 126a15530136
files src/event/quic/ngx_event_quic_output.c
diffstat 1 files changed, 56 insertions(+), 64 deletions(-) [+]
line wrap: on
line diff
--- a/src/event/quic/ngx_event_quic_output.c
+++ b/src/event/quic/ngx_event_quic_output.c
@@ -60,6 +60,8 @@ static ssize_t ngx_quic_send_segments(ng
 static ssize_t ngx_quic_output_packet(ngx_connection_t *c,
     ngx_quic_send_ctx_t *ctx, u_char *data, size_t max, size_t min,
     ngx_quic_socket_t *qsock);
+static void ngx_quic_init_packet(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx,
+    ngx_quic_socket_t *qsock, ngx_quic_header_t *pkt);
 static ngx_uint_t ngx_quic_get_padding_level(ngx_connection_t *c);
 static ssize_t ngx_quic_send(ngx_connection_t *c, u_char *buf, size_t len,
     struct sockaddr *sockaddr, socklen_t socklen);
@@ -530,18 +532,17 @@ static ssize_t
 ngx_quic_output_packet(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx,
     u_char *data, size_t max, size_t min, ngx_quic_socket_t *qsock)
 {
-    size_t                  len, hlen, pad_len;
-    u_char                 *p;
-    ssize_t                 flen;
-    ngx_str_t               out, res;
-    ngx_int_t               rc;
-    ngx_uint_t              nframes, has_pr;
-    ngx_msec_t              now;
-    ngx_queue_t            *q;
-    ngx_quic_frame_t       *f;
-    ngx_quic_header_t       pkt;
-    ngx_quic_connection_t  *qc;
-    static u_char           src[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE];
+    size_t              len, hlen, pad_len;
+    u_char             *p;
+    ssize_t             flen;
+    ngx_str_t           out, res;
+    ngx_int_t           rc;
+    ngx_uint_t          nframes, has_pr;
+    ngx_msec_t          now;
+    ngx_queue_t        *q;
+    ngx_quic_frame_t   *f;
+    ngx_quic_header_t   pkt;
+    static u_char       src[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE];
 
     if (ngx_queue_empty(&ctx->frames)) {
         return 0;
@@ -552,7 +553,7 @@ ngx_quic_output_packet(ngx_connection_t 
                    qsock->sid.seqnum, ngx_quic_level_name(ctx->level),
                    max, min);
 
-    qc = ngx_quic_get_connection(c);
+    ngx_quic_init_packet(c, ctx, qsock, &pkt);
 
     hlen = (ctx->level == ssl_encryption_application)
            ? NGX_QUIC_MAX_SHORT_HEADER
@@ -561,8 +562,6 @@ ngx_quic_output_packet(ngx_connection_t 
     hlen += EVP_GCM_TLS_TAG_LEN;
     hlen -= NGX_QUIC_MAX_CID_LEN - qsock->cid->len;
 
-    ngx_memzero(&pkt, sizeof(ngx_quic_header_t));
-
     now = ngx_current_msec;
     nframes = 0;
     p = src;
@@ -630,33 +629,6 @@ ngx_quic_output_packet(ngx_connection_t 
     out.data = src;
     out.len = len;
 
-    pkt.keys = qc->keys;
-    pkt.flags = NGX_QUIC_PKT_FIXED_BIT;
-
-    if (ctx->level == ssl_encryption_initial) {
-        pkt.flags |= NGX_QUIC_PKT_LONG | NGX_QUIC_PKT_INITIAL;
-
-    } else if (ctx->level == ssl_encryption_handshake) {
-        pkt.flags |= NGX_QUIC_PKT_LONG | NGX_QUIC_PKT_HANDSHAKE;
-
-    } else {
-        if (qc->key_phase) {
-            pkt.flags |= NGX_QUIC_PKT_KPHASE;
-        }
-    }
-
-    ngx_quic_set_packet_number(&pkt, ctx);
-
-    pkt.version = qc->version;
-    pkt.log = c->log;
-    pkt.level = ctx->level;
-
-    pkt.dcid.data = qsock->cid->id;
-    pkt.dcid.len = qsock->cid->len;
-
-    pkt.scid.data = qsock->sid.id;
-    pkt.scid.len = qsock->sid.len;
-
     pad_len = 4;
 
     if (min || has_pr) {
@@ -729,6 +701,46 @@ ngx_quic_output_packet(ngx_connection_t 
 }
 
 
+static void
+ngx_quic_init_packet(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx,
+    ngx_quic_socket_t *qsock, ngx_quic_header_t *pkt)
+{
+    ngx_quic_connection_t  *qc;
+
+    qc = ngx_quic_get_connection(c);
+
+    ngx_memzero(pkt, sizeof(ngx_quic_header_t));
+
+    pkt->flags = NGX_QUIC_PKT_FIXED_BIT;
+
+    if (ctx->level == ssl_encryption_initial) {
+        pkt->flags |= NGX_QUIC_PKT_LONG | NGX_QUIC_PKT_INITIAL;
+
+    } else if (ctx->level == ssl_encryption_handshake) {
+        pkt->flags |= NGX_QUIC_PKT_LONG | NGX_QUIC_PKT_HANDSHAKE;
+
+    } else {
+        if (qc->key_phase) {
+            pkt->flags |= NGX_QUIC_PKT_KPHASE;
+        }
+    }
+
+    pkt->dcid.data = qsock->cid->id;
+    pkt->dcid.len = qsock->cid->len;
+
+    pkt->scid.data = qsock->sid.id;
+    pkt->scid.len = qsock->sid.len;
+
+    pkt->version = qc->version;
+    pkt->log = c->log;
+    pkt->level = ctx->level;
+
+    pkt->keys = qc->keys;
+
+    ngx_quic_set_packet_number(pkt, ctx);
+}
+
+
 static ssize_t
 ngx_quic_send(ngx_connection_t *c, u_char *buf, size_t len,
     struct sockaddr *sockaddr, socklen_t socklen)
@@ -1251,8 +1263,9 @@ ngx_quic_frame_sendto(ngx_connection_t *
     static u_char           dst[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE];
 
     qc = ngx_quic_get_connection(c);
+    ctx = ngx_quic_get_send_ctx(qc, ssl_encryption_application);
 
-    ngx_memzero(&pkt, sizeof(ngx_quic_header_t));
+    ngx_quic_init_packet(c, ctx, qc->socket, &pkt);
 
     len = ngx_quic_create_frame(NULL, frame);
     if (len > NGX_QUIC_MAX_UDP_PAYLOAD_SIZE) {
@@ -1271,27 +1284,6 @@ ngx_quic_frame_sendto(ngx_connection_t *
         len = min;
     }
 
-    pkt.keys = qc->keys;
-    pkt.flags = NGX_QUIC_PKT_FIXED_BIT;
-
-    if (qc->key_phase) {
-        pkt.flags |= NGX_QUIC_PKT_KPHASE;
-    }
-
-    ctx = ngx_quic_get_send_ctx(qc, ssl_encryption_application);
-
-    ngx_quic_set_packet_number(&pkt, ctx);
-
-    pkt.version = qc->version;
-    pkt.log = c->log;
-    pkt.level = ctx->level;
-
-    pkt.dcid.data = qc->socket->cid->id;
-    pkt.dcid.len = qc->socket->cid->len;
-
-    pkt.scid.data = qc->socket->sid.id;
-    pkt.scid.len = qc->socket->sid.len;
-
     pkt.payload.data = src;
     pkt.payload.len = len;