# HG changeset patch # User Vladimir Homutov # Date 1632992549 -10800 # Node ID d8ac4d3c24ac37330a35d024e0ec6fcfaf77ad2b # Parent c5155a0cb12fdfa1a2f18cb27dd468b824131bb0 QUIC: added function to initialize packet. diff --git a/src/event/quic/ngx_event_quic_output.c b/src/event/quic/ngx_event_quic_output.c --- 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;