aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/event/quic/ngx_event_quic_output.c120
1 files changed, 56 insertions, 64 deletions
diff --git a/src/event/quic/ngx_event_quic_output.c b/src/event/quic/ngx_event_quic_output.c
index d7e74a63a..1fc8fadd5 100644
--- 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(ngx_connection_t *c, u_char *buf,
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 *c, ngx_quic_send_ctx_t *ctx,
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 *c, ngx_quic_send_ctx_t *ctx,
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 *c, ngx_quic_send_ctx_t *ctx,
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 *c, ngx_quic_send_ctx_t *ctx,
}
+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 *c, ngx_quic_frame_t *frame,
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 *c, ngx_quic_frame_t *frame,
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;