comparison src/event/ngx_event_quic.c @ 8307:dc7ac778aafe quic

Introduced packet namespace in QUIC connection. The structure contains all data that is related to the namespace: packet number and output queue (next patch).
author Vladimir Homutov <vl@nginx.com>
date Wed, 01 Apr 2020 14:31:08 +0300
parents 058a5af7ddfc
children e10b4c61420f
comparison
equal deleted inserted replaced
8306:058a5af7ddfc 8307:dc7ac778aafe
5 5
6 6
7 #include <ngx_config.h> 7 #include <ngx_config.h>
8 #include <ngx_core.h> 8 #include <ngx_core.h>
9 #include <ngx_event.h> 9 #include <ngx_event.h>
10
11
12 /* 0-RTT and 1-RTT data exist in the same packet number space,
13 * so we have 3 packet number spaces:
14 *
15 * 0 - Initial
16 * 1 - Handshake
17 * 2 - 0-RTT and 1-RTT
18 */
19 #define ngx_quic_ns(level) \
20 ((level) == ssl_encryption_initial) ? 0 \
21 : (((level) == ssl_encryption_handshake) ? 1 : 2)
22
23 #define NGX_QUIC_NAMESPACE_LAST (NGX_QUIC_ENCRYPTION_LAST - 1)
10 24
11 25
12 typedef enum { 26 typedef enum {
13 NGX_QUIC_ST_INITIAL, /* connection just created */ 27 NGX_QUIC_ST_INITIAL, /* connection just created */
14 NGX_QUIC_ST_HANDSHAKE, /* handshake started */ 28 NGX_QUIC_ST_HANDSHAKE, /* handshake started */
24 38
25 ngx_uint_t id_counter; 39 ngx_uint_t id_counter;
26 } ngx_quic_streams_t; 40 } ngx_quic_streams_t;
27 41
28 42
43 typedef struct {
44 ngx_quic_secret_t client_secret;
45 ngx_quic_secret_t server_secret;
46
47 ngx_uint_t pnum;
48 } ngx_quic_namespace_t;
49
50
29 struct ngx_quic_connection_s { 51 struct ngx_quic_connection_s {
30 ngx_str_t scid; 52 ngx_str_t scid;
31 ngx_str_t dcid; 53 ngx_str_t dcid;
32 ngx_str_t token; 54 ngx_str_t token;
33 55
35 ngx_quic_tp_t tp; 57 ngx_quic_tp_t tp;
36 ngx_quic_tp_t ctp; 58 ngx_quic_tp_t ctp;
37 59
38 ngx_quic_state_t state; 60 ngx_quic_state_t state;
39 61
40 /* current packet numbers for each namespace */ 62 ngx_quic_namespace_t ns[NGX_QUIC_NAMESPACE_LAST];
41 ngx_uint_t initial_pn;
42 ngx_uint_t handshake_pn;
43 ngx_uint_t appdata_pn;
44
45 ngx_quic_secrets_t keys[NGX_QUIC_ENCRYPTION_LAST]; 63 ngx_quic_secrets_t keys[NGX_QUIC_ENCRYPTION_LAST];
46 uint64_t crypto_offset[NGX_QUIC_ENCRYPTION_LAST]; 64 uint64_t crypto_offset[NGX_QUIC_ENCRYPTION_LAST];
47 65
48 ngx_ssl_t *ssl; 66 ngx_ssl_t *ssl;
49 ngx_quic_frame_t *frames; 67 ngx_quic_frame_t *frames;
1104 ack_frame = ngx_quic_alloc_frame(c, 0); 1122 ack_frame = ngx_quic_alloc_frame(c, 0);
1105 if (ack_frame == NULL) { 1123 if (ack_frame == NULL) {
1106 return NGX_ERROR; 1124 return NGX_ERROR;
1107 } 1125 }
1108 1126
1109 ack_frame->level = pkt->level; 1127 ack_frame->level = (pkt->level == ssl_encryption_early_data)
1128 ? ssl_encryption_application
1129 : pkt->level;
1130
1110 ack_frame->type = NGX_QUIC_FT_ACK; 1131 ack_frame->type = NGX_QUIC_FT_ACK;
1111 ack_frame->u.ack.pn = pkt->pn; 1132 ack_frame->u.ack.pn = pkt->pn;
1112 1133
1113 ngx_sprintf(ack_frame->info, "ACK for PN=%d from frame handler level=%d", pkt->pn, pkt->level); 1134 ngx_sprintf(ack_frame->info, "ACK for PN=%d from frame handler level=%d", pkt->pn, ack_frame->level);
1114 ngx_quic_queue_frame(qc, ack_frame); 1135 ngx_quic_queue_frame(qc, ack_frame);
1115 1136
1116 return ngx_quic_output(c); 1137 return ngx_quic_output(c);
1117 } 1138 }
1118 1139
1452 u_char *p; 1473 u_char *p;
1453 ngx_str_t out, res; 1474 ngx_str_t out, res;
1454 ngx_quic_frame_t *f; 1475 ngx_quic_frame_t *f;
1455 ngx_quic_header_t pkt; 1476 ngx_quic_header_t pkt;
1456 ngx_quic_secrets_t *keys; 1477 ngx_quic_secrets_t *keys;
1478 ngx_quic_namespace_t *ns;
1457 ngx_quic_connection_t *qc; 1479 ngx_quic_connection_t *qc;
1458 static ngx_str_t initial_token = ngx_null_string; 1480 static ngx_str_t initial_token = ngx_null_string;
1459 static u_char src[NGX_QUIC_DEFAULT_MAX_PACKET_SIZE]; 1481 static u_char src[NGX_QUIC_DEFAULT_MAX_PACKET_SIZE];
1460 static u_char dst[NGX_QUIC_DEFAULT_MAX_PACKET_SIZE]; 1482 static u_char dst[NGX_QUIC_DEFAULT_MAX_PACKET_SIZE];
1461 1483
1491 out.len, start->level); 1513 out.len, start->level);
1492 1514
1493 qc = c->quic; 1515 qc = c->quic;
1494 1516
1495 keys = &c->quic->keys[start->level]; 1517 keys = &c->quic->keys[start->level];
1518 ns = &c->quic->ns[ngx_quic_ns(start->level)];
1496 1519
1497 pkt.secret = &keys->server; 1520 pkt.secret = &keys->server;
1521 pkt.number = ns->pnum;
1498 1522
1499 if (start->level == ssl_encryption_initial) { 1523 if (start->level == ssl_encryption_initial) {
1500 pkt.number = &qc->initial_pn;
1501 pkt.flags = NGX_QUIC_PKT_INITIAL; 1524 pkt.flags = NGX_QUIC_PKT_INITIAL;
1502 pkt.token = initial_token; 1525 pkt.token = initial_token;
1503 1526
1504 } else if (start->level == ssl_encryption_handshake) { 1527 } else if (start->level == ssl_encryption_handshake) {
1505 pkt.number = &qc->handshake_pn;
1506 pkt.flags = NGX_QUIC_PKT_HANDSHAKE; 1528 pkt.flags = NGX_QUIC_PKT_HANDSHAKE;
1507
1508 } else {
1509 pkt.number = &qc->appdata_pn;
1510 } 1529 }
1511 1530
1512 pkt.log = c->log; 1531 pkt.log = c->log;
1513 pkt.level = start->level; 1532 pkt.level = start->level;
1514 pkt.dcid = qc->dcid; 1533 pkt.dcid = qc->dcid;
1523 1542
1524 ngx_quic_hexdump0(c->log, "packet to send", res.data, res.len); 1543 ngx_quic_hexdump0(c->log, "packet to send", res.data, res.len);
1525 1544
1526 c->send(c, res.data, res.len); // TODO: err handling 1545 c->send(c, res.data, res.len); // TODO: err handling
1527 1546
1528 (*pkt.number)++; 1547 ns->pnum++;
1529 1548
1530 return NGX_OK; 1549 return NGX_OK;
1531 } 1550 }
1532 1551
1533 1552