summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorRoman Arutyunyan <arut@nginx.com>2021-12-14 16:24:20 +0300
committerRoman Arutyunyan <arut@nginx.com>2021-12-14 16:24:20 +0300
commit3341a850763eec48263a4ab2fd3a35008b11da3e (patch)
tree63b9e2497e2b229a992784e54f7b53ccebc53132
parent10fd8be86d657839fbc6218891bfe9046ab5b592 (diff)
downloadnginx-3341a850763eec48263a4ab2fd3a35008b11da3e.tar.gz
nginx-3341a850763eec48263a4ab2fd3a35008b11da3e.tar.bz2
QUIC: added path limiting function ngx_quic_path_limit().
-rw-r--r--src/event/quic/ngx_event_quic_output.c40
1 files changed, 24 insertions, 16 deletions
diff --git a/src/event/quic/ngx_event_quic_output.c b/src/event/quic/ngx_event_quic_output.c
index 3963ef006..6d1859512 100644
--- a/src/event/quic/ngx_event_quic_output.c
+++ b/src/event/quic/ngx_event_quic_output.c
@@ -63,6 +63,8 @@ static ssize_t ngx_quic_send(ngx_connection_t *c, u_char *buf, size_t len,
struct sockaddr *sockaddr, socklen_t socklen);
static void ngx_quic_set_packet_number(ngx_quic_header_t *pkt,
ngx_quic_send_ctx_t *ctx);
+static size_t ngx_quic_path_limit(ngx_connection_t *c, ngx_quic_path_t *path,
+ size_t size);
size_t
@@ -137,7 +139,6 @@ ngx_quic_socket_output(ngx_connection_t *c, ngx_quic_socket_t *qsock)
static ngx_int_t
ngx_quic_create_datagrams(ngx_connection_t *c, ngx_quic_socket_t *qsock)
{
- off_t max;
size_t len, min;
ssize_t n;
u_char *p;
@@ -160,12 +161,7 @@ ngx_quic_create_datagrams(ngx_connection_t *c, ngx_quic_socket_t *qsock)
len = ngx_min(qc->ctp.max_udp_payload_size,
NGX_QUIC_MAX_UDP_PAYLOAD_SIZE);
- if (path->limited) {
- max = path->received * 3;
- max = (path->sent >= max) ? 0 : max - path->sent;
-
- len = ngx_min(len, (size_t) max);
- }
+ len = ngx_quic_path_limit(c, path, len);
pad = ngx_quic_get_padding_level(c);
@@ -1212,7 +1208,6 @@ ngx_int_t
ngx_quic_frame_sendto(ngx_connection_t *c, ngx_quic_frame_t *frame,
size_t min, ngx_quic_path_t *path)
{
- off_t max;
size_t min_payload, pad;
ssize_t len, sent;
ngx_str_t res;
@@ -1228,14 +1223,7 @@ ngx_quic_frame_sendto(ngx_connection_t *c, ngx_quic_frame_t *frame,
ngx_quic_init_packet(c, ctx, qc->socket, &pkt);
- /* account for anti-amplification limit: expand to allowed size */
- if (path->limited) {
- max = path->received * 3;
- max = (path->sent >= max) ? 0 : max - path->sent;
- if ((off_t) min > max) {
- min = max;
- }
- }
+ min = ngx_quic_path_limit(c, path, min);
min_payload = min ? ngx_quic_payload_size(&pkt, min) : 0;
@@ -1279,3 +1267,23 @@ ngx_quic_frame_sendto(ngx_connection_t *c, ngx_quic_frame_t *frame,
return NGX_OK;
}
+
+
+static size_t
+ngx_quic_path_limit(ngx_connection_t *c, ngx_quic_path_t *path, size_t size)
+{
+ off_t max;
+
+ if (path->limited) {
+ max = path->received * 3;
+ max = (path->sent >= max) ? 0 : max - path->sent;
+
+ if ((off_t) size > max) {
+ ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
+ "quic path limit %uz - %O", size, max);
+ return max;
+ }
+ }
+
+ return size;
+}