comparison src/event/ngx_event_quic.c @ 8265:d45325e90221 quic

Limit output QUIC packets with client max_packet_size. Additionally, receive larger packets than 512 bytes.
author Roman Arutyunyan <arut@nginx.com>
date Mon, 23 Mar 2020 18:47:17 +0300
parents 1295b293d09a
children f92e583fc256
comparison
equal deleted inserted replaced
8264:c58bbe31e87d 8265:d45325e90221
39 ngx_str_t dcid; 39 ngx_str_t dcid;
40 ngx_str_t token; 40 ngx_str_t token;
41 41
42 ngx_uint_t client_tp_done; 42 ngx_uint_t client_tp_done;
43 ngx_quic_tp_t tp; 43 ngx_quic_tp_t tp;
44 ngx_quic_tp_t ctp;
44 45
45 ngx_quic_state_t state; 46 ngx_quic_state_t state;
46 47
47 /* current packet numbers for each namespace */ 48 /* current packet numbers for each namespace */
48 ngx_uint_t initial_pn; 49 ngx_uint_t initial_pn;
217 enum ssl_encryption_level_t level, const uint8_t *data, size_t len) 218 enum ssl_encryption_level_t level, const uint8_t *data, size_t len)
218 { 219 {
219 u_char *p, *end; 220 u_char *p, *end;
220 size_t client_params_len; 221 size_t client_params_len;
221 const uint8_t *client_params; 222 const uint8_t *client_params;
222 ngx_quic_tp_t ctp;
223 ngx_quic_frame_t *frame; 223 ngx_quic_frame_t *frame;
224 ngx_connection_t *c; 224 ngx_connection_t *c;
225 ngx_quic_connection_t *qc; 225 ngx_quic_connection_t *qc;
226 226
227 c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn); 227 c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);
242 242
243 if (client_params_len != 0) { 243 if (client_params_len != 0) {
244 p = (u_char *) client_params; 244 p = (u_char *) client_params;
245 end = p + client_params_len; 245 end = p + client_params_len;
246 246
247 ngx_memzero(&ctp, sizeof(ngx_quic_tp_t)); 247 if (ngx_quic_parse_transport_params(p, end, &qc->ctp, c->log)
248 248 != NGX_OK)
249 if (ngx_quic_parse_transport_params(p, end, &ctp, c->log) != NGX_OK)
250 { 249 {
251 return NGX_ERROR; 250 return NGX_ERROR;
252 } 251 }
253
254 /* TODO: save/use obtained client parameters: merge with ours? */
255 252
256 qc->client_tp_done = 1; 253 qc->client_tp_done = 1;
257 } 254 }
258 } 255 }
259 256
369 366
370 static ngx_int_t 367 static ngx_int_t
371 ngx_quic_new_connection(ngx_connection_t *c, ngx_ssl_t *ssl, ngx_quic_tp_t *tp, 368 ngx_quic_new_connection(ngx_connection_t *c, ngx_ssl_t *ssl, ngx_quic_tp_t *tp,
372 ngx_quic_header_t *pkt) 369 ngx_quic_header_t *pkt)
373 { 370 {
371 ngx_quic_tp_t *ctp;
374 ngx_quic_connection_t *qc; 372 ngx_quic_connection_t *qc;
375 373
376 if (ngx_buf_size(pkt->raw) < 1200) { 374 if (ngx_buf_size(pkt->raw) < 1200) {
377 ngx_log_error(NGX_LOG_INFO, c->log, 0, "too small UDP datagram"); 375 ngx_log_error(NGX_LOG_INFO, c->log, 0, "too small UDP datagram");
378 return NGX_ERROR; 376 return NGX_ERROR;
403 ngx_quic_rbtree_insert_stream); 401 ngx_quic_rbtree_insert_stream);
404 402
405 c->quic = qc; 403 c->quic = qc;
406 qc->ssl = ssl; 404 qc->ssl = ssl;
407 qc->tp = *tp; 405 qc->tp = *tp;
406
407 ctp = &qc->ctp;
408 ctp->max_packet_size = NGX_QUIC_DEFAULT_MAX_PACKET_SIZE;
409 ctp->ack_delay_exponent = NGX_QUIC_DEFAULT_ACK_DELAY_EXPONENT;
410 ctp->max_ack_delay = NGX_QUIC_DEFAULT_MAX_ACK_DELAY;
408 411
409 qc->dcid.len = pkt->dcid.len; 412 qc->dcid.len = pkt->dcid.len;
410 qc->dcid.data = ngx_pnalloc(c->pool, pkt->dcid.len); 413 qc->dcid.data = ngx_pnalloc(c->pool, pkt->dcid.len);
411 if (qc->dcid.data == NULL) { 414 if (qc->dcid.data == NULL) {
412 return NGX_ERROR; 415 return NGX_ERROR;
518 { 521 {
519 ssize_t n; 522 ssize_t n;
520 ngx_buf_t b; 523 ngx_buf_t b;
521 ngx_connection_t *c; 524 ngx_connection_t *c;
522 525
523 u_char buf[512]; 526 static u_char buf[65535];
524 527
525 b.start = buf; 528 b.start = buf;
526 b.end = buf + 512; 529 b.end = buf + sizeof(buf);
527 b.pos = b.last = b.start; 530 b.pos = b.last = b.start;
528 531
529 c = rev->data; 532 c = rev->data;
530 533
531 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, rev->log, 0, "quic input handler"); 534 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, rev->log, 0, "quic input handler");
1090 1093
1091 1094
1092 static ngx_int_t 1095 static ngx_int_t
1093 ngx_quic_output(ngx_connection_t *c) 1096 ngx_quic_output(ngx_connection_t *c)
1094 { 1097 {
1095 size_t len; 1098 size_t len, hlen, n;
1096 ngx_uint_t lvl; 1099 ngx_uint_t lvl;
1097 ngx_quic_frame_t *f, *start; 1100 ngx_quic_frame_t *f, *start;
1098 ngx_quic_connection_t *qc; 1101 ngx_quic_connection_t *qc;
1099 1102
1100 qc = c->quic; 1103 qc = c->quic;
1108 f = start; 1111 f = start;
1109 1112
1110 do { 1113 do {
1111 len = 0; 1114 len = 0;
1112 1115
1116 hlen = (lvl == ssl_encryption_application) ? NGX_QUIC_MAX_SHORT_HEADER
1117 : NGX_QUIC_MAX_LONG_HEADER;
1118
1113 do { 1119 do {
1114 /* process same-level group of frames */ 1120 /* process same-level group of frames */
1115 1121
1116 len += ngx_quic_create_frame(NULL, NULL, f);// TODO: handle overflow, max size 1122 n = ngx_quic_create_frame(NULL, NULL, f);
1123
1124 if (len && hlen + len + n > qc->ctp.max_packet_size) {
1125 break;
1126 }
1127
1128 len += n;
1117 1129
1118 f = f->next; 1130 f = f->next;
1119 } while (f && f->level == lvl); 1131 } while (f && f->level == lvl);
1120 1132
1121 1133