Mercurial > hg > nginx
comparison src/event/ngx_event_quic.c @ 8598:85a550047eb5 quic
QUIC: added macro for unset packet number.
author | Vladimir Homutov <vl@nginx.com> |
---|---|
date | Wed, 21 Oct 2020 18:44:25 +0300 |
parents | 0351fcf52a03 |
children | c01964fd7b8b |
comparison
equal
deleted
inserted
replaced
8597:0351fcf52a03 | 8598:85a550047eb5 |
---|---|
33 * Implementations MUST support buffering at least 4096 bytes of data | 33 * Implementations MUST support buffering at least 4096 bytes of data |
34 */ | 34 */ |
35 #define NGX_QUIC_MAX_BUFFERED 65535 | 35 #define NGX_QUIC_MAX_BUFFERED 65535 |
36 | 36 |
37 #define NGX_QUIC_STREAM_GONE (void *) -1 | 37 #define NGX_QUIC_STREAM_GONE (void *) -1 |
38 | |
39 #define NGX_QUIC_UNSET_PN (uint64_t) -1 | |
38 | 40 |
39 /* | 41 /* |
40 * Endpoints MUST discard packets that are too small to be valid QUIC | 42 * Endpoints MUST discard packets that are too small to be valid QUIC |
41 * packets. With the set of AEAD functions defined in [QUIC-TLS], | 43 * packets. With the set of AEAD functions defined in [QUIC-TLS], |
42 * packets that are smaller than 21 bytes are never valid. | 44 * packets that are smaller than 21 bytes are never valid. |
698 ngx_quic_rbtree_insert_stream); | 700 ngx_quic_rbtree_insert_stream); |
699 | 701 |
700 for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) { | 702 for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) { |
701 ngx_queue_init(&qc->send_ctx[i].frames); | 703 ngx_queue_init(&qc->send_ctx[i].frames); |
702 ngx_queue_init(&qc->send_ctx[i].sent); | 704 ngx_queue_init(&qc->send_ctx[i].sent); |
703 qc->send_ctx[i].largest_pn = (uint64_t) -1; | 705 qc->send_ctx[i].largest_pn = NGX_QUIC_UNSET_PN; |
704 qc->send_ctx[i].largest_ack = (uint64_t) -1; | 706 qc->send_ctx[i].largest_ack = NGX_QUIC_UNSET_PN; |
705 qc->send_ctx[i].largest_range = (uint64_t) -1; | 707 qc->send_ctx[i].largest_range = NGX_QUIC_UNSET_PN; |
706 qc->send_ctx[i].pending_ack = (uint64_t) -1; | 708 qc->send_ctx[i].pending_ack = NGX_QUIC_UNSET_PN; |
707 } | 709 } |
708 | 710 |
709 qc->send_ctx[0].level = ssl_encryption_initial; | 711 qc->send_ctx[0].level = ssl_encryption_initial; |
710 qc->send_ctx[1].level = ssl_encryption_handshake; | 712 qc->send_ctx[1].level = ssl_encryption_handshake; |
711 qc->send_ctx[2].level = ssl_encryption_application; | 713 qc->send_ctx[2].level = ssl_encryption_application; |
2027 * thus check also for old dcid | 2029 * thus check also for old dcid |
2028 */ | 2030 */ |
2029 ctx = ngx_quic_get_send_ctx(qc, ssl_encryption_initial); | 2031 ctx = ngx_quic_get_send_ctx(qc, ssl_encryption_initial); |
2030 | 2032 |
2031 if (pkt->level == ssl_encryption_initial | 2033 if (pkt->level == ssl_encryption_initial |
2032 && ctx->largest_ack == (uint64_t) -1) | 2034 && ctx->largest_ack == NGX_QUIC_UNSET_PN) |
2033 { | 2035 { |
2034 if (pkt->dcid.len == qc->odcid.len | 2036 if (pkt->dcid.len == qc->odcid.len |
2035 && ngx_memcmp(pkt->dcid.data, qc->odcid.data, qc->odcid.len) == 0) | 2037 && ngx_memcmp(pkt->dcid.data, qc->odcid.data, qc->odcid.len) == 0) |
2036 { | 2038 { |
2037 goto found; | 2039 goto found; |
2317 | 2319 |
2318 ngx_post_event(&c->quic->push, &ngx_posted_events); | 2320 ngx_post_event(&c->quic->push, &ngx_posted_events); |
2319 | 2321 |
2320 ctx->send_ack = 1; | 2322 ctx->send_ack = 1; |
2321 | 2323 |
2322 if (ctx->pending_ack == (uint64_t) -1 | 2324 if (ctx->pending_ack == NGX_QUIC_UNSET_PN |
2323 || ctx->pending_ack < pkt->pn) | 2325 || ctx->pending_ack < pkt->pn) |
2324 { | 2326 { |
2325 ctx->pending_ack = pkt->pn; | 2327 ctx->pending_ack = pkt->pn; |
2326 } | 2328 } |
2327 } | 2329 } |
2328 | 2330 |
2329 base = ctx->largest_range; | 2331 base = ctx->largest_range; |
2330 pn = pkt->pn; | 2332 pn = pkt->pn; |
2331 | 2333 |
2332 if (base == (uint64_t) -1) { | 2334 if (base == NGX_QUIC_UNSET_PN) { |
2333 ctx->largest_range = pn; | 2335 ctx->largest_range = pn; |
2334 ctx->ack_received = pkt->received; | 2336 ctx->ack_received = pkt->received; |
2335 return NGX_OK; | 2337 return NGX_OK; |
2336 } | 2338 } |
2337 | 2339 |
2355 /* new gap in front of current largest */ | 2357 /* new gap in front of current largest */ |
2356 | 2358 |
2357 /* no place for new range, send current range as is */ | 2359 /* no place for new range, send current range as is */ |
2358 if (ctx->nranges == NGX_QUIC_MAX_RANGES) { | 2360 if (ctx->nranges == NGX_QUIC_MAX_RANGES) { |
2359 | 2361 |
2360 if (prev_pending != (uint64_t) -1) { | 2362 if (prev_pending != NGX_QUIC_UNSET_PN) { |
2361 if (ngx_quic_send_ack(c, ctx) != NGX_OK) { | 2363 if (ngx_quic_send_ack(c, ctx) != NGX_OK) { |
2362 return NGX_ERROR; | 2364 return NGX_ERROR; |
2363 } | 2365 } |
2364 } | 2366 } |
2365 | 2367 |
2366 if (prev_pending == ctx->pending_ack || !pkt->need_ack) { | 2368 if (prev_pending == ctx->pending_ack || !pkt->need_ack) { |
2367 ctx->pending_ack = (uint64_t) -1; | 2369 ctx->pending_ack = NGX_QUIC_UNSET_PN; |
2368 } | 2370 } |
2369 } | 2371 } |
2370 | 2372 |
2371 gap = pn - base - 2; | 2373 gap = pn - base - 2; |
2372 range = ctx->first_range; | 2374 range = ctx->first_range; |
2440 | 2442 |
2441 gap = ge - pn - 1; | 2443 gap = ge - pn - 1; |
2442 range = 0; | 2444 range = 0; |
2443 | 2445 |
2444 if (ctx->nranges == NGX_QUIC_MAX_RANGES) { | 2446 if (ctx->nranges == NGX_QUIC_MAX_RANGES) { |
2445 if (prev_pending != (uint64_t) -1) { | 2447 if (prev_pending != NGX_QUIC_UNSET_PN) { |
2446 if (ngx_quic_send_ack(c, ctx) != NGX_OK) { | 2448 if (ngx_quic_send_ack(c, ctx) != NGX_OK) { |
2447 return NGX_ERROR; | 2449 return NGX_ERROR; |
2448 } | 2450 } |
2449 } | 2451 } |
2450 | 2452 |
2451 if (prev_pending == ctx->pending_ack || !pkt->need_ack) { | 2453 if (prev_pending == ctx->pending_ack || !pkt->need_ack) { |
2452 ctx->pending_ack = (uint64_t) -1; | 2454 ctx->pending_ack = NGX_QUIC_UNSET_PN; |
2453 } | 2455 } |
2454 } | 2456 } |
2455 | 2457 |
2456 r->gap = pn - gs - 1; | 2458 r->gap = pn - gs - 1; |
2457 goto insert; | 2459 goto insert; |
2547 ngx_uint_t i, smallest, largest; | 2549 ngx_uint_t i, smallest, largest; |
2548 ngx_quic_ack_range_t *r; | 2550 ngx_quic_ack_range_t *r; |
2549 | 2551 |
2550 base = ctx->largest_range; | 2552 base = ctx->largest_range; |
2551 | 2553 |
2552 if (base == (uint64_t) -1) { | 2554 if (base == NGX_QUIC_UNSET_PN) { |
2553 return; | 2555 return; |
2554 } | 2556 } |
2555 | 2557 |
2556 if (ctx->pending_ack != (uint64_t) -1 && pn >= ctx->pending_ack) { | 2558 if (ctx->pending_ack != NGX_QUIC_UNSET_PN && pn >= ctx->pending_ack) { |
2557 ctx->pending_ack = (uint64_t) -1; | 2559 ctx->pending_ack = NGX_QUIC_UNSET_PN; |
2558 } | 2560 } |
2559 | 2561 |
2560 largest = base; | 2562 largest = base; |
2561 smallest = largest - ctx->first_range; | 2563 smallest = largest - ctx->first_range; |
2562 | 2564 |
2563 if (pn >= largest) { | 2565 if (pn >= largest) { |
2564 ctx->largest_range = (uint64_t) - 1; | 2566 ctx->largest_range = NGX_QUIC_UNSET_PN; |
2565 ctx->first_range = 0; | 2567 ctx->first_range = 0; |
2566 ctx->nranges = 0; | 2568 ctx->nranges = 0; |
2567 return; | 2569 return; |
2568 } | 2570 } |
2569 | 2571 |
2771 { | 2773 { |
2772 return NGX_ERROR; | 2774 return NGX_ERROR; |
2773 } | 2775 } |
2774 | 2776 |
2775 /* 13.2.3. Receiver Tracking of ACK Frames */ | 2777 /* 13.2.3. Receiver Tracking of ACK Frames */ |
2776 if (ctx->largest_ack < max || ctx->largest_ack == (uint64_t) -1) { | 2778 if (ctx->largest_ack < max || ctx->largest_ack == NGX_QUIC_UNSET_PN) { |
2777 ctx->largest_ack = max; | 2779 ctx->largest_ack = max; |
2778 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, | 2780 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, |
2779 "quic updated largest received ack: %uL", max); | 2781 "quic updated largest received ack: %uL", max); |
2780 | 2782 |
2781 /* | 2783 /* |
4400 | 4402 |
4401 q = ngx_queue_head(&ctx->sent); | 4403 q = ngx_queue_head(&ctx->sent); |
4402 start = ngx_queue_data(q, ngx_quic_frame_t, queue); | 4404 start = ngx_queue_data(q, ngx_quic_frame_t, queue); |
4403 | 4405 |
4404 if (start->pnum <= ctx->largest_ack | 4406 if (start->pnum <= ctx->largest_ack |
4405 && ctx->largest_ack != (uint64_t) -1) | 4407 && ctx->largest_ack != NGX_QUIC_UNSET_PN) |
4406 { | 4408 { |
4407 continue; | 4409 continue; |
4408 } | 4410 } |
4409 | 4411 |
4410 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, | 4412 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, |
4467 | 4469 |
4468 for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) { | 4470 for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) { |
4469 | 4471 |
4470 ctx = &qc->send_ctx[i]; | 4472 ctx = &qc->send_ctx[i]; |
4471 | 4473 |
4472 if (ctx->largest_ack == (uint64_t) -1) { | 4474 if (ctx->largest_ack == NGX_QUIC_UNSET_PN) { |
4473 continue; | 4475 continue; |
4474 } | 4476 } |
4475 | 4477 |
4476 while (!ngx_queue_empty(&ctx->sent)) { | 4478 while (!ngx_queue_empty(&ctx->sent)) { |
4477 | 4479 |