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