annotate src/event/quic/ngx_event_quic_output.c @ 8822:ad046179eb91 quic

QUIC: handle EAGAIN properly on UDP sockets. Previously, the error was ignored leading to unnecessary retransmits. Now, unsent frames are returned into output queue, state is reset, and timer is started for the next send attempt.
author Vladimir Homutov <vl@nginx.com>
date Wed, 28 Jul 2021 17:23:18 +0300
parents 8ab0d609af09
children f3331deed357
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
2 /*
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
3 * Copyright (C) Nginx, Inc.
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
4 */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
5
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
6
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
7 #include <ngx_config.h>
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
8 #include <ngx_core.h>
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
9 #include <ngx_event.h>
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
10 #include <ngx_event_quic_connection.h>
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
11
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
12
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
13 #define NGX_QUIC_MAX_SHORT_HEADER 25 /* 1 flags + 20 dcid + 4 pn */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
14 #define NGX_QUIC_MAX_LONG_HEADER 56
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
15 /* 1 flags + 4 version + 2 x (1 + 20) s/dcid + 4 pn + 4 len + token len */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
16
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
17 #define NGX_QUIC_MAX_UDP_PAYLOAD_OUT 1252
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
18 #define NGX_QUIC_MAX_UDP_PAYLOAD_OUT6 1232
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
19
8811
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
20 #define NGX_QUIC_MAX_UDP_SEGMENT_BUF 65487 /* 65K - IPv6 header */
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
21 #define NGX_QUIC_MAX_SEGMENTS 64 /* UDP_MAX_SEGMENTS */
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
22
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
23 #define NGX_QUIC_RETRY_TOKEN_LIFETIME 3 /* seconds */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
24 #define NGX_QUIC_NEW_TOKEN_LIFETIME 600 /* seconds */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
25 #define NGX_QUIC_RETRY_BUFFER_SIZE 256
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
26 /* 1 flags + 4 version + 3 x (1 + 20) s/o/dcid + itag + token(64) */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
27
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
28 /*
8797
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8763
diff changeset
29 * RFC 9000, 10.3. Stateless Reset
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8763
diff changeset
30 *
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
31 * Endpoints MUST discard packets that are too small to be valid QUIC
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
32 * packets. With the set of AEAD functions defined in [QUIC-TLS],
8797
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8763
diff changeset
33 * short header packets that are smaller than 21 bytes are never valid.
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
34 */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
35 #define NGX_QUIC_MIN_PKT_LEN 21
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
36
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
37 #define NGX_QUIC_MIN_SR_PACKET 43 /* 5 rand + 16 srt + 22 padding */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
38 #define NGX_QUIC_MAX_SR_PACKET 1200
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
39
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
40 #define NGX_QUIC_CC_MIN_INTERVAL 1000 /* 1s */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
41
8822
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
42 #define NGX_QUIC_SOCKET_RETRY_DELAY 10 /* ms, for NGX_AGAIN on write */
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
43
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
44
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
45 static ngx_int_t ngx_quic_socket_output(ngx_connection_t *c,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
46 ngx_quic_socket_t *qsock);
8811
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
47 static ngx_int_t ngx_quic_create_datagrams(ngx_connection_t *c,
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
48 ngx_quic_socket_t *qsock);
8822
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
49 static void ngx_quic_commit_send(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx);
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
50 static void ngx_quic_revert_send(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx,
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
51 uint64_t pnum);
8811
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
52 #if ((NGX_HAVE_UDP_SEGMENT) && (NGX_HAVE_MSGHDR_MSG_CONTROL))
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
53 static ngx_uint_t ngx_quic_allow_segmentation(ngx_connection_t *c,
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
54 ngx_quic_socket_t *qsock);
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
55 static ngx_int_t ngx_quic_create_segments(ngx_connection_t *c,
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
56 ngx_quic_socket_t *qsock);
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
57 static ssize_t ngx_quic_send_segments(ngx_connection_t *c, u_char *buf,
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
58 size_t len, struct sockaddr *sockaddr, socklen_t socklen, size_t segment);
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
59 #endif
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
60 static ssize_t ngx_quic_output_packet(ngx_connection_t *c,
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
61 ngx_quic_send_ctx_t *ctx, u_char *data, size_t max, size_t min,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
62 ngx_quic_socket_t *qsock);
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
63 static ngx_uint_t ngx_quic_get_padding_level(ngx_connection_t *c);
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
64 static ssize_t ngx_quic_send(ngx_connection_t *c, u_char *buf, size_t len,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
65 struct sockaddr *sockaddr, socklen_t socklen);
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
66 static void ngx_quic_set_packet_number(ngx_quic_header_t *pkt,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
67 ngx_quic_send_ctx_t *ctx);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
68
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
69
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
70 size_t
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
71 ngx_quic_max_udp_payload(ngx_connection_t *c)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
72 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
73 /* TODO: path MTU discovery */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
74
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
75 #if (NGX_HAVE_INET6)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
76 if (c->sockaddr->sa_family == AF_INET6) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
77 return NGX_QUIC_MAX_UDP_PAYLOAD_OUT6;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
78 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
79 #endif
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
80
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
81 return NGX_QUIC_MAX_UDP_PAYLOAD_OUT;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
82 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
83
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
84
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
85 ngx_int_t
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
86 ngx_quic_output(ngx_connection_t *c)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
87 {
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
88 ngx_quic_connection_t *qc;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
89
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
90 qc = ngx_quic_get_connection(c);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
91
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
92 if (ngx_quic_socket_output(c, qc->socket) != NGX_OK) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
93 return NGX_ERROR;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
94 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
95
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
96 ngx_quic_set_lost_timer(c);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
97
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
98 return NGX_OK;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
99 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
100
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
101
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
102 static ngx_int_t
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
103 ngx_quic_socket_output(ngx_connection_t *c, ngx_quic_socket_t *qsock)
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
104 {
8811
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
105 size_t in_flight;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
106 ngx_int_t rc;
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
107 ngx_quic_congestion_t *cg;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
108 ngx_quic_connection_t *qc;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
109
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
110 c->log->action = "sending frames";
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
111
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
112 qc = ngx_quic_get_connection(c);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
113 cg = &qc->congestion;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
114
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
115 in_flight = cg->in_flight;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
116
8811
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
117 #if ((NGX_HAVE_UDP_SEGMENT) && (NGX_HAVE_MSGHDR_MSG_CONTROL))
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
118 if (ngx_quic_allow_segmentation(c, qsock)) {
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
119 rc = ngx_quic_create_segments(c, qsock);
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
120 } else
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
121 #endif
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
122 {
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
123 rc = ngx_quic_create_datagrams(c, qsock);
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
124 }
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
125
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
126 if (rc != NGX_OK) {
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
127 return NGX_ERROR;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
128 }
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
129
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
130 if (in_flight != cg->in_flight && !qc->send_timer_set && !qc->closing) {
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
131 qc->send_timer_set = 1;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
132 ngx_add_timer(c->read, qc->tp.max_idle_timeout);
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
133 }
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
134
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
135 return NGX_OK;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
136 }
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
137
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
138
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
139 static ngx_int_t
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
140 ngx_quic_create_datagrams(ngx_connection_t *c, ngx_quic_socket_t *qsock)
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
141 {
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
142 off_t max;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
143 size_t len, min;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
144 ssize_t n;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
145 u_char *p;
8822
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
146 uint64_t preserved_pnum[NGX_QUIC_SEND_CTX_LAST];
8811
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
147 ngx_uint_t i, pad;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
148 ngx_quic_path_t *path;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
149 ngx_quic_send_ctx_t *ctx;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
150 ngx_quic_connection_t *qc;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
151 static u_char dst[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE];
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
152
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
153 qc = ngx_quic_get_connection(c);
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
154 path = qsock->path;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
155
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
156 for ( ;; ) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
157 p = dst;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
158
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
159 len = ngx_min(qc->ctp.max_udp_payload_size,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
160 NGX_QUIC_MAX_UDP_PAYLOAD_SIZE);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
161
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
162 if (path->state != NGX_QUIC_PATH_VALIDATED) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
163 max = path->received * 3;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
164 max = (path->sent >= max) ? 0 : max - path->sent;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
165
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
166 len = ngx_min(len, (size_t) max);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
167 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
168
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
169 pad = ngx_quic_get_padding_level(c);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
170
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
171 for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
172
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
173 ctx = &qc->send_ctx[i];
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
174
8822
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
175 preserved_pnum[i] = ctx->pnum;
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
176
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
177 if (ngx_quic_generate_ack(c, ctx) != NGX_OK) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
178 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
179 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
180
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
181 min = (i == pad && p - dst < NGX_QUIC_MIN_INITIAL_SIZE)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
182 ? NGX_QUIC_MIN_INITIAL_SIZE - (p - dst) : 0;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
183
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
184 n = ngx_quic_output_packet(c, ctx, p, len, min, qsock);
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
185 if (n == NGX_ERROR) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
186 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
187 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
188
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
189 p += n;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
190 len -= n;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
191 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
192
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
193 len = p - dst;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
194 if (len == 0) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
195 break;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
196 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
197
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
198 n = ngx_quic_send(c, dst, len, path->sockaddr, path->socklen);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
199
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
200 if (n == NGX_ERROR) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
201 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
202 }
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
203
8822
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
204 if (n == NGX_AGAIN) {
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
205 for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) {
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
206 ngx_quic_revert_send(c, &qc->send_ctx[i], preserved_pnum[i]);
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
207 }
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
208
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
209 ngx_add_timer(&qc->push, NGX_QUIC_SOCKET_RETRY_DELAY);
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
210 break;
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
211 }
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
212
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
213 for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) {
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
214 ngx_quic_commit_send(c, &qc->send_ctx[i]);
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
215 }
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
216
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
217 path->sent += len;
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
218 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
219
8811
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
220 return NGX_OK;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
221 }
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
222
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
223
8822
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
224 static void
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
225 ngx_quic_commit_send(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx)
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
226 {
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
227 ngx_queue_t *q;
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
228 ngx_quic_frame_t *f;
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
229 ngx_quic_congestion_t *cg;
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
230 ngx_quic_connection_t *qc;
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
231
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
232 qc = ngx_quic_get_connection(c);
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
233
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
234 cg = &qc->congestion;
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
235
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
236 while (!ngx_queue_empty(&ctx->sending)) {
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
237
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
238 q = ngx_queue_head(&ctx->sending);
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
239 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
240
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
241 ngx_queue_remove(q);
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
242
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
243 if (f->pkt_need_ack && !qc->closing) {
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
244 ngx_queue_insert_tail(&ctx->sent, q);
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
245
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
246 cg->in_flight += f->plen;
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
247
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
248 } else {
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
249 ngx_quic_free_frame(c, f);
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
250 }
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
251 }
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
252
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
253 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
254 "quic congestion send if:%uz", cg->in_flight);
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
255 }
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
256
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
257
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
258 static void
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
259 ngx_quic_revert_send(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx,
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
260 uint64_t pnum)
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
261 {
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
262 ngx_queue_t *q;
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
263
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
264 while (!ngx_queue_empty(&ctx->sending)) {
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
265
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
266 q = ngx_queue_last(&ctx->sending);
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
267 ngx_queue_remove(q);
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
268 ngx_queue_insert_head(&ctx->frames, q);
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
269 }
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
270
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
271 ctx->pnum = pnum;
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
272 }
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
273
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
274
8811
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
275 #if ((NGX_HAVE_UDP_SEGMENT) && (NGX_HAVE_MSGHDR_MSG_CONTROL))
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
276
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
277 static ngx_uint_t
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
278 ngx_quic_allow_segmentation(ngx_connection_t *c, ngx_quic_socket_t *qsock)
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
279 {
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
280 size_t bytes, len;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
281 ngx_queue_t *q;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
282 ngx_quic_frame_t *f;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
283 ngx_quic_send_ctx_t *ctx;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
284 ngx_quic_connection_t *qc;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
285
8815
8ab0d609af09 QUIC: the "quic_gso" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8811
diff changeset
286 qc = ngx_quic_get_connection(c);
8ab0d609af09 QUIC: the "quic_gso" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8811
diff changeset
287
8ab0d609af09 QUIC: the "quic_gso" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8811
diff changeset
288 if (!qc->conf->gso_enabled) {
8ab0d609af09 QUIC: the "quic_gso" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8811
diff changeset
289 return 0;
8ab0d609af09 QUIC: the "quic_gso" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8811
diff changeset
290 }
8ab0d609af09 QUIC: the "quic_gso" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8811
diff changeset
291
8811
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
292 if (qsock->path->state != NGX_QUIC_PATH_VALIDATED) {
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
293 /* don't even try to be faster on non-validated paths */
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
294 return 0;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
295 }
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
296
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
297 ctx = ngx_quic_get_send_ctx(qc, ssl_encryption_initial);
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
298 if (!ngx_queue_empty(&ctx->frames)) {
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
299 return 0;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
300 }
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
301
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
302 ctx = ngx_quic_get_send_ctx(qc, ssl_encryption_handshake);
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
303 if (!ngx_queue_empty(&ctx->frames)) {
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
304 return 0;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
305 }
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
306
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
307 ctx = ngx_quic_get_send_ctx(qc, ssl_encryption_application);
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
308
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
309 bytes = 0;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
310
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
311 len = ngx_min(qc->ctp.max_udp_payload_size,
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
312 NGX_QUIC_MAX_UDP_SEGMENT_BUF);
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
313
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
314 for (q = ngx_queue_head(&ctx->frames);
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
315 q != ngx_queue_sentinel(&ctx->frames);
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
316 q = ngx_queue_next(q))
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
317 {
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
318 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
319
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
320 bytes += f->len;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
321
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
322 if (bytes > len * 3) {
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
323 /* require at least ~3 full packets to batch */
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
324 return 1;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
325 }
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
326 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
327
8811
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
328 return 0;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
329 }
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
330
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
331
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
332 static ngx_int_t
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
333 ngx_quic_create_segments(ngx_connection_t *c, ngx_quic_socket_t *qsock)
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
334 {
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
335 size_t len, segsize;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
336 ssize_t n;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
337 u_char *p, *end;
8822
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
338 uint64_t preserved_pnum;
8811
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
339 ngx_uint_t nseg;
8822
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
340 ngx_quic_path_t *path;
8811
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
341 ngx_quic_send_ctx_t *ctx;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
342 ngx_quic_connection_t *qc;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
343 static u_char dst[NGX_QUIC_MAX_UDP_SEGMENT_BUF];
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
344
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
345 qc = ngx_quic_get_connection(c);
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
346 path = qsock->path;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
347
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
348 ctx = ngx_quic_get_send_ctx(qc, ssl_encryption_application);
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
349
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
350 if (ngx_quic_generate_ack(c, ctx) != NGX_OK) {
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
351 return NGX_ERROR;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
352 }
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
353
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
354 segsize = ngx_min(qc->ctp.max_udp_payload_size,
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
355 NGX_QUIC_MAX_UDP_SEGMENT_BUF);
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
356 p = dst;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
357 end = dst + sizeof(dst);
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
358
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
359 nseg = 0;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
360
8822
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
361 preserved_pnum = ctx->pnum;
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
362
8811
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
363 for ( ;; ) {
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
364
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
365 len = ngx_min(segsize, (size_t) (end - p));
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
366
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
367 if (len) {
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
368
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
369 n = ngx_quic_output_packet(c, ctx, p, len, len, qsock);
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
370 if (n == NGX_ERROR) {
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
371 return NGX_ERROR;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
372 }
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
373
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
374 p += n;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
375 nseg++;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
376
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
377 } else {
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
378 n = 0;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
379 }
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
380
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
381 if (p == dst) {
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
382 break;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
383 }
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
384
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
385 if (n == 0 || nseg == NGX_QUIC_MAX_SEGMENTS) {
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
386 n = ngx_quic_send_segments(c, dst, p - dst, path->sockaddr,
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
387 path->socklen, segsize);
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
388 if (n == NGX_ERROR) {
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
389 return NGX_ERROR;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
390 }
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
391
8822
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
392 if (n == NGX_AGAIN) {
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
393 ngx_quic_revert_send(c, ctx, preserved_pnum);
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
394
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
395 ngx_add_timer(&qc->push, NGX_QUIC_SOCKET_RETRY_DELAY);
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
396 break;
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
397 }
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
398
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
399 ngx_quic_commit_send(c, ctx);
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
400
8811
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
401 path->sent += n;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
402
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
403 p = dst;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
404 nseg = 0;
8822
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
405 preserved_pnum = ctx->pnum;
8811
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
406 }
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
407 }
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
408
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
409 return NGX_OK;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
410 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
411
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
412
8811
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
413 static ssize_t
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
414 ngx_quic_send_segments(ngx_connection_t *c, u_char *buf, size_t len,
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
415 struct sockaddr *sockaddr, socklen_t socklen, size_t segment)
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
416 {
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
417 size_t clen;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
418 ssize_t n;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
419 uint16_t *valp;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
420 struct iovec iov;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
421 struct msghdr msg;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
422 struct cmsghdr *cmsg;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
423
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
424 #if defined(NGX_HAVE_ADDRINFO_CMSG)
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
425 char msg_control[CMSG_SPACE(sizeof(uint16_t))
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
426 + CMSG_SPACE(sizeof(ngx_addrinfo_t))];
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
427 #else
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
428 char msg_control[CMSG_SPACE(sizeof(uint16_t))];
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
429 #endif
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
430
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
431 ngx_memzero(&msg, sizeof(struct msghdr));
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
432 ngx_memzero(msg_control, sizeof(msg_control));
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
433
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
434 iov.iov_len = len;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
435 iov.iov_base = buf;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
436
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
437 msg.msg_iov = &iov;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
438 msg.msg_iovlen = 1;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
439
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
440 msg.msg_name = sockaddr;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
441 msg.msg_namelen = socklen;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
442
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
443 msg.msg_control = msg_control;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
444 msg.msg_controllen = sizeof(msg_control);
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
445
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
446 cmsg = CMSG_FIRSTHDR(&msg);
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
447
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
448 cmsg->cmsg_level = SOL_UDP;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
449 cmsg->cmsg_type = UDP_SEGMENT;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
450 cmsg->cmsg_len = CMSG_LEN(sizeof(uint16_t));
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
451
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
452 clen = CMSG_SPACE(sizeof(uint16_t));
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
453
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
454 valp = (void *) CMSG_DATA(cmsg);
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
455 *valp = segment;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
456
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
457 #if defined(NGX_HAVE_ADDRINFO_CMSG)
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
458 if (c->listening && c->listening->wildcard && c->local_sockaddr) {
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
459 cmsg = CMSG_NXTHDR(&msg, cmsg);
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
460 clen += ngx_set_srcaddr_cmsg(cmsg, c->local_sockaddr);
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
461 }
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
462 #endif
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
463
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
464 msg.msg_controllen = clen;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
465
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
466 n = ngx_sendmsg(c, &msg, 0);
8822
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
467 if (n < 0) {
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
468 return n;
8811
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
469 }
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
470
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
471 c->sent += n;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
472
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
473 return n;
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
474 }
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
475
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
476 #endif
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
477
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
478
bb5152ed045b QUIC: added support for segmentation offloading.
Vladimir Homutov <vl@nginx.com>
parents: 8808
diff changeset
479
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
480 static ngx_uint_t
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
481 ngx_quic_get_padding_level(ngx_connection_t *c)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
482 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
483 ngx_queue_t *q;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
484 ngx_quic_frame_t *f;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
485 ngx_quic_send_ctx_t *ctx;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
486 ngx_quic_connection_t *qc;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
487
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
488 /*
8797
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8763
diff changeset
489 * RFC 9000, 14.1. Initial Datagram Size
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
490 *
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
491 * Similarly, a server MUST expand the payload of all UDP datagrams
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
492 * carrying ack-eliciting Initial packets to at least the smallest
8797
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8763
diff changeset
493 * allowed maximum datagram size of 1200 bytes.
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
494 */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
495
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
496 qc = ngx_quic_get_connection(c);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
497 ctx = ngx_quic_get_send_ctx(qc, ssl_encryption_initial);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
498
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
499 for (q = ngx_queue_head(&ctx->frames);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
500 q != ngx_queue_sentinel(&ctx->frames);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
501 q = ngx_queue_next(q))
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
502 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
503 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
504
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
505 if (f->need_ack) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
506 ctx = ngx_quic_get_send_ctx(qc, ssl_encryption_handshake);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
507
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
508 if (ngx_queue_empty(&ctx->frames)) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
509 return 0;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
510 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
511
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
512 return 1;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
513 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
514 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
515
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
516 return NGX_QUIC_SEND_CTX_LAST;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
517 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
518
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
519
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
520 static ssize_t
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
521 ngx_quic_output_packet(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx,
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
522 u_char *data, size_t max, size_t min, ngx_quic_socket_t *qsock)
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
523 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
524 size_t len, hlen, pad_len;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
525 u_char *p;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
526 ssize_t flen;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
527 ngx_str_t out, res;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
528 ngx_int_t rc;
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
529 ngx_uint_t nframes, has_pr;
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
530 ngx_msec_t now;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
531 ngx_queue_t *q;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
532 ngx_quic_frame_t *f;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
533 ngx_quic_header_t pkt;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
534 ngx_quic_congestion_t *cg;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
535 ngx_quic_connection_t *qc;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
536 static u_char src[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE];
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
537
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
538 if (ngx_queue_empty(&ctx->frames)) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
539 return 0;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
540 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
541
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
542 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
543 "quic output sock #%uL %s packet max:%uz min:%uz",
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
544 qsock->sid.seqnum, ngx_quic_level_name(ctx->level),
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
545 max, min);
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
546
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
547 qc = ngx_quic_get_connection(c);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
548 cg = &qc->congestion;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
549
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
550 hlen = (ctx->level == ssl_encryption_application)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
551 ? NGX_QUIC_MAX_SHORT_HEADER
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
552 : NGX_QUIC_MAX_LONG_HEADER;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
553
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
554 hlen += EVP_GCM_TLS_TAG_LEN;
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
555 hlen -= NGX_QUIC_MAX_CID_LEN - qsock->cid->len;
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
556
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
557 ngx_memzero(&pkt, sizeof(ngx_quic_header_t));
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
558
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
559 now = ngx_current_msec;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
560 nframes = 0;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
561 p = src;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
562 len = 0;
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
563 has_pr = 0;
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
564
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
565 for (q = ngx_queue_head(&ctx->frames);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
566 q != ngx_queue_sentinel(&ctx->frames);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
567 q = ngx_queue_next(q))
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
568 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
569 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
570
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
571 if (!pkt.need_ack && f->need_ack && max > cg->window) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
572 max = cg->window;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
573 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
574
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
575 if (f->type == NGX_QUIC_FT_PATH_RESPONSE
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
576 || f->type == NGX_QUIC_FT_PATH_CHALLENGE)
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
577 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
578 has_pr = 1;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
579 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
580
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
581 if (hlen + len >= max) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
582 break;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
583 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
584
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
585 if (hlen + len + f->len > max) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
586 rc = ngx_quic_split_frame(c, f, max - hlen - len);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
587
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
588 if (rc == NGX_ERROR) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
589 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
590 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
591
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
592 if (rc == NGX_DECLINED) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
593 break;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
594 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
595 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
596
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
597 if (f->need_ack) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
598 pkt.need_ack = 1;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
599 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
600
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
601 ngx_quic_log_frame(c->log, f, 1);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
602
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
603 flen = ngx_quic_create_frame(p, f);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
604 if (flen == -1) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
605 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
606 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
607
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
608 len += flen;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
609 p += flen;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
610
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
611 f->pnum = ctx->pnum;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
612 f->first = now;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
613 f->last = now;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
614 f->plen = 0;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
615
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
616 nframes++;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
617
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
618 if (f->flush) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
619 break;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
620 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
621 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
622
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
623 if (nframes == 0) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
624 return 0;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
625 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
626
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
627 out.data = src;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
628 out.len = len;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
629
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
630 pkt.keys = qc->keys;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
631 pkt.flags = NGX_QUIC_PKT_FIXED_BIT;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
632
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
633 if (ctx->level == ssl_encryption_initial) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
634 pkt.flags |= NGX_QUIC_PKT_LONG | NGX_QUIC_PKT_INITIAL;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
635
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
636 } else if (ctx->level == ssl_encryption_handshake) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
637 pkt.flags |= NGX_QUIC_PKT_LONG | NGX_QUIC_PKT_HANDSHAKE;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
638
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
639 } else {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
640 if (qc->key_phase) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
641 pkt.flags |= NGX_QUIC_PKT_KPHASE;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
642 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
643 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
644
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
645 ngx_quic_set_packet_number(&pkt, ctx);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
646
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
647 pkt.version = qc->version;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
648 pkt.log = c->log;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
649 pkt.level = ctx->level;
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
650
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
651 pkt.dcid.data = qsock->cid->id;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
652 pkt.dcid.len = qsock->cid->len;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
653
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
654 pkt.scid.data = qsock->sid.id;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
655 pkt.scid.len = qsock->sid.len;
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
656
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
657 pad_len = 4;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
658
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
659 if (min || has_pr) {
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
660 hlen = EVP_GCM_TLS_TAG_LEN
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
661 + ngx_quic_create_header(&pkt, NULL, out.len, NULL);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
662
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
663 /*
8797
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8763
diff changeset
664 * RFC 9000, 8.2.1. Initiating Path Validation
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8763
diff changeset
665 *
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
666 * An endpoint MUST expand datagrams that contain a
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
667 * PATH_CHALLENGE frame to at least the smallest allowed
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
668 * maximum datagram size of 1200 bytes, unless the
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
669 * anti-amplification limit for the path does not permit
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
670 * sending a datagram of this size.
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
671 *
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
672 * (same applies to PATH_RESPONSE frames)
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
673 */
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
674
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
675 if (has_pr) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
676 min = ngx_max(1200, min);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
677 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
678
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
679 if (min > hlen + pad_len) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
680 pad_len = min - hlen;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
681 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
682 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
683
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
684 if (out.len < pad_len) {
8808
5b0c229ba5fe QUIC: fixed padding calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8797
diff changeset
685 /* compensate for potentially enlarged header in Length bytes */
5b0c229ba5fe QUIC: fixed padding calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8797
diff changeset
686 pad_len -= ngx_quic_create_header(&pkt, NULL, pad_len, NULL)
5b0c229ba5fe QUIC: fixed padding calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8797
diff changeset
687 - ngx_quic_create_header(&pkt, NULL, out.len, NULL);
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
688 ngx_memset(p, NGX_QUIC_FT_PADDING, pad_len - out.len);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
689 out.len = pad_len;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
690 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
691
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
692 pkt.payload = out;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
693
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
694 res.data = data;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
695
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
696 ngx_log_debug6(NGX_LOG_DEBUG_EVENT, c->log, 0,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
697 "quic packet tx %s bytes:%ui"
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
698 " need_ack:%d number:%L encoded nl:%d trunc:0x%xD",
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
699 ngx_quic_level_name(ctx->level), out.len, pkt.need_ack,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
700 pkt.number, pkt.num_len, pkt.trunc);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
701
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
702 if (ngx_quic_encrypt(&pkt, &res) != NGX_OK) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
703 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
704 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
705
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
706 ctx->pnum++;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
707
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
708 if (pkt.need_ack) {
8822
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
709 q = ngx_queue_head(&ctx->frames);
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
710 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
711
8822
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
712 f->plen = res.len;
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
713 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
714
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
715 while (nframes--) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
716 q = ngx_queue_head(&ctx->frames);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
717 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
718
8822
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
719 f->pkt_need_ack = pkt.need_ack;
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
720
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
721 ngx_queue_remove(q);
8822
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
722 ngx_queue_insert_tail(&ctx->sending, q);
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
723 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
724
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
725 return res.len;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
726 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
727
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
728
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
729 static ssize_t
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
730 ngx_quic_send(ngx_connection_t *c, u_char *buf, size_t len,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
731 struct sockaddr *sockaddr, socklen_t socklen)
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
732 {
8822
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
733 ssize_t n;
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
734 struct iovec iov;
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
735 struct msghdr msg;
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
736 #if defined(NGX_HAVE_ADDRINFO_CMSG)
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
737 struct cmsghdr *cmsg;
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
738 char msg_control[CMSG_SPACE(sizeof(ngx_addrinfo_t))];
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
739 #endif
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
740
8822
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
741 ngx_memzero(&msg, sizeof(struct msghdr));
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
742
8822
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
743 iov.iov_len = len;
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
744 iov.iov_base = buf;
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
745
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
746 msg.msg_iov = &iov;
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
747 msg.msg_iovlen = 1;
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
748
8822
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
749 msg.msg_name = sockaddr;
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
750 msg.msg_namelen = socklen;
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
751
8822
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
752 #if defined(NGX_HAVE_ADDRINFO_CMSG)
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
753 if (c->listening && c->listening->wildcard && c->local_sockaddr) {
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
754
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
755 msg.msg_control = msg_control;
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
756 msg.msg_controllen = sizeof(msg_control);
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
757 ngx_memzero(msg_control, sizeof(msg_control));
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
758
8822
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
759 cmsg = CMSG_FIRSTHDR(&msg);
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
760
8822
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
761 msg.msg_controllen = ngx_set_srcaddr_cmsg(cmsg, c->local_sockaddr);
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
762 }
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
763 #endif
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
764
8822
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
765 n = ngx_sendmsg(c, &msg, 0);
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
766 if (n < 0) {
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
767 return n;
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
768 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
769
8822
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
770 c->sent += n;
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
771
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
772 return n;
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
773 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
774
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
775
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
776 static void
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
777 ngx_quic_set_packet_number(ngx_quic_header_t *pkt, ngx_quic_send_ctx_t *ctx)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
778 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
779 uint64_t delta;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
780
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
781 delta = ctx->pnum - ctx->largest_ack;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
782 pkt->number = ctx->pnum;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
783
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
784 if (delta <= 0x7F) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
785 pkt->num_len = 1;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
786 pkt->trunc = ctx->pnum & 0xff;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
787
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
788 } else if (delta <= 0x7FFF) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
789 pkt->num_len = 2;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
790 pkt->flags |= 0x1;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
791 pkt->trunc = ctx->pnum & 0xffff;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
792
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
793 } else if (delta <= 0x7FFFFF) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
794 pkt->num_len = 3;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
795 pkt->flags |= 0x2;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
796 pkt->trunc = ctx->pnum & 0xffffff;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
797
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
798 } else {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
799 pkt->num_len = 4;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
800 pkt->flags |= 0x3;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
801 pkt->trunc = ctx->pnum & 0xffffffff;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
802 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
803 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
804
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
805
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
806 ngx_int_t
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
807 ngx_quic_negotiate_version(ngx_connection_t *c, ngx_quic_header_t *inpkt)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
808 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
809 size_t len;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
810 ngx_quic_header_t pkt;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
811 static u_char buf[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE];
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
812
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
813 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
814 "sending version negotiation packet");
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
815
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
816 pkt.log = c->log;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
817 pkt.flags = NGX_QUIC_PKT_LONG | NGX_QUIC_PKT_FIXED_BIT;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
818 pkt.dcid = inpkt->scid;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
819 pkt.scid = inpkt->dcid;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
820
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
821 len = ngx_quic_create_version_negotiation(&pkt, buf);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
822
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
823 #ifdef NGX_QUIC_DEBUG_PACKETS
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
824 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
825 "quic vnego packet to send len:%uz %*xs", len, len, buf);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
826 #endif
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
827
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
828 (void) ngx_quic_send(c, buf, len, c->sockaddr, c->socklen);
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
829
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
830 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
831 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
832
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
833
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
834 int
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
835 ngx_quic_send_alert(ngx_ssl_conn_t *ssl_conn, enum ssl_encryption_level_t level,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
836 uint8_t alert)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
837 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
838 ngx_connection_t *c;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
839 ngx_quic_connection_t *qc;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
840
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
841 c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
842
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
843 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
844 "quic ngx_quic_send_alert() lvl:%d alert:%d",
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
845 (int) level, (int) alert);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
846
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
847 qc = ngx_quic_get_connection(c);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
848 if (qc == NULL) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
849 return 1;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
850 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
851
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
852 qc->error_level = level;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
853 qc->error = NGX_QUIC_ERR_CRYPTO(alert);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
854 qc->error_reason = "TLS alert";
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
855 qc->error_app = 0;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
856 qc->error_ftype = 0;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
857
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
858 if (ngx_quic_send_cc(c) != NGX_OK) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
859 return 0;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
860 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
861
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
862 return 1;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
863 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
864
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
865
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
866 ngx_int_t
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
867 ngx_quic_send_stateless_reset(ngx_connection_t *c, ngx_quic_conf_t *conf,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
868 ngx_quic_header_t *pkt)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
869 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
870 u_char *token;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
871 size_t len, max;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
872 uint16_t rndbytes;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
873 u_char buf[NGX_QUIC_MAX_SR_PACKET];
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
874
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
875 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
876 "quic handle stateless reset output");
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
877
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
878 if (pkt->len <= NGX_QUIC_MIN_PKT_LEN) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
879 return NGX_DECLINED;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
880 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
881
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
882 if (pkt->len <= NGX_QUIC_MIN_SR_PACKET) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
883 len = pkt->len - 1;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
884
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
885 } else {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
886 max = ngx_min(NGX_QUIC_MAX_SR_PACKET, pkt->len * 3);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
887
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
888 if (RAND_bytes((u_char *) &rndbytes, sizeof(rndbytes)) != 1) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
889 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
890 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
891
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
892 len = (rndbytes % (max - NGX_QUIC_MIN_SR_PACKET + 1))
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
893 + NGX_QUIC_MIN_SR_PACKET;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
894 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
895
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
896 if (RAND_bytes(buf, len - NGX_QUIC_SR_TOKEN_LEN) != 1) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
897 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
898 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
899
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
900 buf[0] &= ~NGX_QUIC_PKT_LONG;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
901 buf[0] |= NGX_QUIC_PKT_FIXED_BIT;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
902
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
903 token = &buf[len - NGX_QUIC_SR_TOKEN_LEN];
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
904
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
905 if (ngx_quic_new_sr_token(c, &pkt->dcid, conf->sr_token_key, token)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
906 != NGX_OK)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
907 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
908 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
909 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
910
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
911 (void) ngx_quic_send(c, buf, len, c->sockaddr, c->socklen);
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
912
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
913 return NGX_DECLINED;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
914 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
915
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
916
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
917 ngx_int_t
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
918 ngx_quic_send_cc(ngx_connection_t *c)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
919 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
920 ngx_quic_frame_t *frame;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
921 ngx_quic_connection_t *qc;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
922
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
923 qc = ngx_quic_get_connection(c);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
924
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
925 if (qc->draining) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
926 return NGX_OK;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
927 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
928
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
929 if (qc->closing
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
930 && ngx_current_msec - qc->last_cc < NGX_QUIC_CC_MIN_INTERVAL)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
931 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
932 /* dot not send CC too often */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
933 return NGX_OK;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
934 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
935
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
936 frame = ngx_quic_alloc_frame(c);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
937 if (frame == NULL) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
938 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
939 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
940
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
941 frame->level = qc->error_level;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
942 frame->type = qc->error_app ? NGX_QUIC_FT_CONNECTION_CLOSE_APP
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
943 : NGX_QUIC_FT_CONNECTION_CLOSE;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
944 frame->u.close.error_code = qc->error;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
945 frame->u.close.frame_type = qc->error_ftype;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
946
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
947 if (qc->error_reason) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
948 frame->u.close.reason.len = ngx_strlen(qc->error_reason);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
949 frame->u.close.reason.data = (u_char *) qc->error_reason;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
950 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
951
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
952 ngx_quic_queue_frame(qc, frame);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
953
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
954 qc->last_cc = ngx_current_msec;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
955
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
956 return ngx_quic_output(c);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
957 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
958
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
959
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
960 ngx_int_t
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
961 ngx_quic_send_early_cc(ngx_connection_t *c, ngx_quic_header_t *inpkt,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
962 ngx_uint_t err, const char *reason)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
963 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
964 ssize_t len;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
965 ngx_str_t res;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
966 ngx_quic_frame_t frame;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
967 ngx_quic_header_t pkt;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
968
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
969 static u_char src[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE];
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
970 static u_char dst[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE];
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
971
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
972 ngx_memzero(&frame, sizeof(ngx_quic_frame_t));
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
973 ngx_memzero(&pkt, sizeof(ngx_quic_header_t));
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
974
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
975 frame.level = inpkt->level;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
976 frame.type = NGX_QUIC_FT_CONNECTION_CLOSE;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
977 frame.u.close.error_code = err;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
978
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
979 frame.u.close.reason.data = (u_char *) reason;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
980 frame.u.close.reason.len = ngx_strlen(reason);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
981
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
982 len = ngx_quic_create_frame(NULL, &frame);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
983 if (len > NGX_QUIC_MAX_UDP_PAYLOAD_SIZE) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
984 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
985 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
986
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
987 ngx_quic_log_frame(c->log, &frame, 1);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
988
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
989 len = ngx_quic_create_frame(src, &frame);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
990 if (len == -1) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
991 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
992 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
993
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
994 pkt.keys = ngx_quic_keys_new(c->pool);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
995 if (pkt.keys == NULL) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
996 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
997 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
998
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
999 if (ngx_quic_keys_set_initial_secret(c->pool, pkt.keys, &inpkt->dcid,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1000 inpkt->version)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1001 != NGX_OK)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1002 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1003 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1004 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1005
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1006 pkt.flags = NGX_QUIC_PKT_FIXED_BIT | NGX_QUIC_PKT_LONG
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1007 | NGX_QUIC_PKT_INITIAL;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1008
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1009 pkt.num_len = 1;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1010 /*
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1011 * pkt.num = 0;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1012 * pkt.trunc = 0;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1013 */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1014
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1015 pkt.version = inpkt->version;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1016 pkt.log = c->log;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1017 pkt.level = inpkt->level;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1018 pkt.dcid = inpkt->scid;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1019 pkt.scid = inpkt->dcid;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1020 pkt.payload.data = src;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1021 pkt.payload.len = len;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1022
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1023 res.data = dst;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1024
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1025 if (ngx_quic_encrypt(&pkt, &res) != NGX_OK) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1026 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1027 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1028
8822
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
1029 if (ngx_quic_send(c, res.data, res.len, c->sockaddr, c->socklen) < 0) {
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1030 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1031 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1032
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1033 return NGX_OK;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1034 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1035
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1036
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1037 ngx_int_t
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1038 ngx_quic_send_retry(ngx_connection_t *c, ngx_quic_conf_t *conf,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1039 ngx_quic_header_t *inpkt)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1040 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1041 time_t expires;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1042 ssize_t len;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1043 ngx_str_t res, token;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1044 ngx_quic_header_t pkt;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1045
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1046 u_char buf[NGX_QUIC_RETRY_BUFFER_SIZE];
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1047 u_char dcid[NGX_QUIC_SERVER_CID_LEN];
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1048
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1049 expires = ngx_time() + NGX_QUIC_RETRY_TOKEN_LIFETIME;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1050
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1051 if (ngx_quic_new_token(c, c->sockaddr, c->socklen, conf->av_token_key,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1052 &token, &inpkt->dcid, expires, 1)
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1053 != NGX_OK)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1054 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1055 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1056 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1057
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1058 ngx_memzero(&pkt, sizeof(ngx_quic_header_t));
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1059 pkt.flags = NGX_QUIC_PKT_FIXED_BIT | NGX_QUIC_PKT_LONG | NGX_QUIC_PKT_RETRY;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1060 pkt.version = inpkt->version;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1061 pkt.log = c->log;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1062
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1063 pkt.odcid = inpkt->dcid;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1064 pkt.dcid = inpkt->scid;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1065
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1066 /* TODO: generate routable dcid */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1067 if (RAND_bytes(dcid, NGX_QUIC_SERVER_CID_LEN) != 1) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1068 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1069 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1070
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1071 pkt.scid.len = NGX_QUIC_SERVER_CID_LEN;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1072 pkt.scid.data = dcid;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1073
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1074 pkt.token = token;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1075
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1076 res.data = buf;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1077
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1078 if (ngx_quic_encrypt(&pkt, &res) != NGX_OK) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1079 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1080 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1081
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1082 #ifdef NGX_QUIC_DEBUG_PACKETS
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1083 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1084 "quic packet to send len:%uz %xV", res.len, &res);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1085 #endif
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1086
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1087 len = ngx_quic_send(c, res.data, res.len, c->sockaddr, c->socklen);
8822
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
1088 if (len < 0) {
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1089 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1090 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1091
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1092 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1093 "quic retry packet sent to %xV", &pkt.dcid);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1094
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1095 /*
8797
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8763
diff changeset
1096 * RFC 9000, 17.2.5.1. Sending a Retry Packet
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8763
diff changeset
1097 *
4715f3e669f1 QUIC: updated specification references.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8763
diff changeset
1098 * A server MUST NOT send more than one Retry
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1099 * packet in response to a single UDP datagram.
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1100 * NGX_DONE will stop quic_input() from processing further
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1101 */
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1102 return NGX_DONE;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1103 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1104
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1105
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1106 ngx_int_t
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1107 ngx_quic_send_new_token(ngx_connection_t *c, ngx_quic_path_t *path)
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1108 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1109 time_t expires;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1110 ngx_str_t token;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1111 ngx_quic_frame_t *frame;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1112 ngx_quic_connection_t *qc;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1113
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1114 qc = ngx_quic_get_connection(c);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1115
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1116 expires = ngx_time() + NGX_QUIC_NEW_TOKEN_LIFETIME;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1117
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1118 if (ngx_quic_new_token(c, path->sockaddr, path->socklen,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1119 qc->conf->av_token_key, &token, NULL, expires, 0)
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1120 != NGX_OK)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1121 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1122 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1123 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1124
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1125 frame = ngx_quic_alloc_frame(c);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1126 if (frame == NULL) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1127 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1128 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1129
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1130 frame->level = ssl_encryption_application;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1131 frame->type = NGX_QUIC_FT_NEW_TOKEN;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1132 frame->u.token.length = token.len;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1133 frame->u.token.data = token.data;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1134
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1135 ngx_quic_queue_frame(qc, frame);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1136
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1137 return NGX_OK;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1138 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1139
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1140
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1141 ngx_int_t
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1142 ngx_quic_send_ack(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1143 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1144 size_t len, left;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1145 uint64_t ack_delay;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1146 ngx_buf_t *b;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1147 ngx_uint_t i;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1148 ngx_chain_t *cl, **ll;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1149 ngx_quic_frame_t *frame;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1150 ngx_quic_connection_t *qc;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1151
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1152 qc = ngx_quic_get_connection(c);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1153
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1154 ack_delay = ngx_current_msec - ctx->largest_received;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1155 ack_delay *= 1000;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1156 ack_delay >>= qc->tp.ack_delay_exponent;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1157
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1158 frame = ngx_quic_alloc_frame(c);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1159 if (frame == NULL) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1160 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1161 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1162
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1163 ll = &frame->data;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1164 b = NULL;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1165
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1166 for (i = 0; i < ctx->nranges; i++) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1167 len = ngx_quic_create_ack_range(NULL, ctx->ranges[i].gap,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1168 ctx->ranges[i].range);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1169
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1170 left = b ? b->end - b->last : 0;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1171
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1172 if (left < len) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1173 cl = ngx_quic_alloc_buf(c);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1174 if (cl == NULL) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1175 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1176 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1177
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1178 *ll = cl;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1179 ll = &cl->next;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1180
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1181 b = cl->buf;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1182 left = b->end - b->last;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1183
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1184 if (left < len) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1185 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1186 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1187 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1188
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1189 b->last += ngx_quic_create_ack_range(b->last, ctx->ranges[i].gap,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1190 ctx->ranges[i].range);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1191
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1192 frame->u.ack.ranges_length += len;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1193 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1194
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1195 *ll = NULL;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1196
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1197 frame->level = ctx->level;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1198 frame->type = NGX_QUIC_FT_ACK;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1199 frame->u.ack.largest = ctx->largest_range;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1200 frame->u.ack.delay = ack_delay;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1201 frame->u.ack.range_count = ctx->nranges;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1202 frame->u.ack.first_range = ctx->first_range;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1203
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1204 ngx_quic_queue_frame(qc, frame);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1205
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1206 return NGX_OK;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1207 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1208
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1209
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1210 ngx_int_t
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1211 ngx_quic_send_ack_range(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx,
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1212 uint64_t smallest, uint64_t largest)
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1213 {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1214 ngx_quic_frame_t *frame;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1215 ngx_quic_connection_t *qc;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1216
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1217 qc = ngx_quic_get_connection(c);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1218
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1219 frame = ngx_quic_alloc_frame(c);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1220 if (frame == NULL) {
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1221 return NGX_ERROR;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1222 }
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1223
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1224 frame->level = ctx->level;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1225 frame->type = NGX_QUIC_FT_ACK;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1226 frame->u.ack.largest = largest;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1227 frame->u.ack.delay = 0;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1228 frame->u.ack.range_count = 0;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1229 frame->u.ack.first_range = largest - smallest;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1230
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1231 ngx_quic_queue_frame(qc, frame);
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1232
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1233 return NGX_OK;
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1234 }
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1235
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1236
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1237 ssize_t
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1238 ngx_quic_frame_sendto(ngx_connection_t *c, ngx_quic_frame_t *frame,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1239 size_t min, struct sockaddr *sockaddr, socklen_t socklen)
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1240 {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1241 ssize_t len;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1242 ngx_str_t res;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1243 ngx_quic_header_t pkt;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1244 ngx_quic_send_ctx_t *ctx;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1245 ngx_quic_connection_t *qc;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1246
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1247 static u_char src[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE];
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1248 static u_char dst[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE];
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1249
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1250 qc = ngx_quic_get_connection(c);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1251
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1252 ngx_memzero(&pkt, sizeof(ngx_quic_header_t));
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1253
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1254 len = ngx_quic_create_frame(NULL, frame);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1255 if (len > NGX_QUIC_MAX_UDP_PAYLOAD_SIZE) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1256 return -1;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1257 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1258
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1259 ngx_quic_log_frame(c->log, frame, 1);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1260
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1261 len = ngx_quic_create_frame(src, frame);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1262 if (len == -1) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1263 return -1;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1264 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1265
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1266 if (len < (ssize_t) min) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1267 ngx_memset(src + len, NGX_QUIC_FT_PADDING, min - len);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1268 len = min;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1269 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1270
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1271 pkt.keys = qc->keys;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1272 pkt.flags = NGX_QUIC_PKT_FIXED_BIT;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1273
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1274 if (qc->key_phase) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1275 pkt.flags |= NGX_QUIC_PKT_KPHASE;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1276 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1277
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1278 ctx = ngx_quic_get_send_ctx(qc, ssl_encryption_application);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1279
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1280 ngx_quic_set_packet_number(&pkt, ctx);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1281
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1282 pkt.version = qc->version;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1283 pkt.log = c->log;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1284 pkt.level = ctx->level;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1285
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1286 pkt.dcid.data = qc->socket->cid->id;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1287 pkt.dcid.len = qc->socket->cid->len;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1288
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1289 pkt.scid.data = qc->socket->sid.id;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1290 pkt.scid.len = qc->socket->sid.len;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1291
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1292 pkt.payload.data = src;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1293 pkt.payload.len = len;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1294
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1295 res.data = dst;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1296
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1297 if (ngx_quic_encrypt(&pkt, &res) != NGX_OK) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1298 return -1;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1299 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1300
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1301 ctx->pnum++;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1302
8822
ad046179eb91 QUIC: handle EAGAIN properly on UDP sockets.
Vladimir Homutov <vl@nginx.com>
parents: 8815
diff changeset
1303 return ngx_quic_send(c, res.data, res.len, sockaddr, socklen);
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8751
diff changeset
1304 }