Mercurial > hg > nginx-quic
comparison src/event/ngx_event_quic.c @ 7731: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
7730:c58bbe31e87d | 7731: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 |