Mercurial > hg > nginx-quic
comparison src/event/ngx_event_quic.c @ 7773: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
7772:058a5af7ddfc | 7773: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 |