comparison src/event/ngx_event_quic_transport.h @ 8224:ae35ccba7aa6 quic

Extracted transport part of the code into separate file. All code dealing with serializing/deserializing is moved int srv/event/ngx_event_quic_transport.c/h file. All macros for dealing with data are internal to source file. The header file exposes frame types and error codes. The exported functions are currently packet header parsers and writers and frames parser/writer. The ngx_quic_header_t structure is updated with 'log' member. This avoids passing extra argument to parsing functions that need to report errors.
author Vladimir Homutov <vl@nginx.com>
date Wed, 18 Mar 2020 12:58:27 +0300
parents
children 78540e2160d0
comparison
equal deleted inserted replaced
8223:61f9b873e2e7 8224:ae35ccba7aa6
1
2 /*
3 * Copyright (C) Nginx, Inc.
4 */
5
6
7 #ifndef _NGX_EVENT_QUIC_WIRE_H_INCLUDED_
8 #define _NGX_EVENT_QUIC_WIRE_H_INCLUDED_
9
10
11 #include <ngx_event_openssl.h>
12
13
14 /* 17.2. Long Header Packets */
15 #define NGX_QUIC_PKT_LONG 0x80
16
17 #define NGX_QUIC_PKT_INITIAL 0xC0
18 #define NGX_QUIC_PKT_HANDSHAKE 0xE0
19
20 /* 12.4. Frames and Frame Types */
21 #define NGX_QUIC_FT_PADDING 0x00
22 #define NGX_QUIC_FT_PING 0x01
23 #define NGX_QUIC_FT_ACK 0x02
24 #define NGX_QUIC_FT_ACK_ECN 0x03
25 #define NGX_QUIC_FT_RESET_STREAM 0x04
26 #define NGX_QUIC_FT_STOP_SENDING 0x05
27 #define NGX_QUIC_FT_CRYPTO 0x06
28 #define NGX_QUIC_FT_NEW_TOKEN 0x07
29 #define NGX_QUIC_FT_STREAM0 0x08
30 #define NGX_QUIC_FT_STREAM1 0x09
31 #define NGX_QUIC_FT_STREAM2 0x0A
32 #define NGX_QUIC_FT_STREAM3 0x0B
33 #define NGX_QUIC_FT_STREAM4 0x0C
34 #define NGX_QUIC_FT_STREAM5 0x0D
35 #define NGX_QUIC_FT_STREAM6 0x0E
36 #define NGX_QUIC_FT_STREAM7 0x0F
37 #define NGX_QUIC_FT_MAX_DATA 0x10
38 #define NGX_QUIC_FT_MAX_STREAM_DATA 0x11
39 #define NGX_QUIC_FT_MAX_STREAMS 0x12
40 #define NGX_QUIC_FT_MAX_STREAMS2 0x13 // XXX
41 #define NGX_QUIC_FT_DATA_BLOCKED 0x14
42 #define NGX_QUIC_FT_STREAM_DATA_BLOCKED 0x15
43 #define NGX_QUIC_FT_STREAMS_BLOCKED 0x16
44 #define NGX_QUIC_FT_STREAMS_BLOCKED2 0x17 // XXX
45 #define NGX_QUIC_FT_NEW_CONNECTION_ID 0x18
46 #define NGX_QUIC_FT_RETIRE_CONNECTION_ID 0x19
47 #define NGX_QUIC_FT_PATH_CHALLENGE 0x1A
48 #define NGX_QUIC_FT_PATH_RESPONSE 0x1B
49 #define NGX_QUIC_FT_CONNECTION_CLOSE 0x1C
50 #define NGX_QUIC_FT_CONNECTION_CLOSE2 0x1D // XXX
51 #define NGX_QUIC_FT_HANDSHAKE_DONE 0x1E
52
53 /* 22.4. QUIC Transport Error Codes Registry */
54 #define NGX_QUIC_ERR_NO_ERROR 0x00
55 #define NGX_QUIC_ERR_INTERNAL_ERROR 0x01
56 #define NGX_QUIC_ERR_SERVER_BUSY 0x02
57 #define NGX_QUIC_ERR_FLOW_CONTROL_ERROR 0x03
58 #define NGX_QUIC_ERR_STREAM_LIMIT_ERROR 0x04
59 #define NGX_QUIC_ERR_STREAM_STATE_ERROR 0x05
60 #define NGX_QUIC_ERR_FINAL_SIZE_ERROR 0x06
61 #define NGX_QUIC_ERR_FRAME_ENCODING_ERROR 0x07
62 #define NGX_QUIC_ERR_TRANSPORT_PARAMETER_ERROR 0x08
63 #define NGX_QUIC_ERR_CONNECTION_ID_LIMIT_ERROR 0x09
64 #define NGX_QUIC_ERR_PROTOCOL_VIOLATION 0x0A
65 #define NGX_QUIC_ERR_INVALID_TOKEN 0x0B
66 /* 0xC is not defined */
67 #define NGX_QUIC_ERR_CRYPTO_BUFFER_EXCEEDED 0x0D
68 #define NGX_QUIC_ERR_CRYPTO_ERROR 0x10
69
70 #define NGX_QUIC_ERR_LAST NGX_QUIC_ERR_CRYPTO_ERROR
71
72
73 typedef struct {
74 ngx_uint_t pn;
75 uint64_t largest;
76 uint64_t delay;
77 uint64_t range_count;
78 uint64_t first_range;
79 uint64_t ranges[20];
80 /* TODO: ecn counts */
81 } ngx_quic_ack_frame_t;
82
83
84 typedef struct {
85 size_t offset;
86 size_t len;
87 u_char *data;
88 } ngx_quic_crypto_frame_t;
89
90
91 typedef struct {
92 uint64_t seqnum;
93 uint64_t retire;
94 uint64_t len;
95 u_char cid[20];
96 u_char srt[16];
97 } ngx_quic_new_conn_id_frame_t;
98
99
100 typedef struct {
101 uint8_t type;
102 uint64_t stream_id;
103 uint64_t offset;
104 uint64_t length;
105 unsigned off:1;
106 unsigned len:1;
107 unsigned fin:1;
108 u_char *data;
109 } ngx_quic_stream_frame_t;
110
111
112 typedef struct {
113 uint64_t error_code;
114 uint64_t frame_type;
115 ngx_str_t reason;
116 } ngx_quic_close_frame_t;
117
118
119 typedef struct ngx_quic_frame_s ngx_quic_frame_t;
120
121 struct ngx_quic_frame_s {
122 ngx_uint_t type;
123 enum ssl_encryption_level_t level;
124 ngx_quic_frame_t *next;
125 union {
126 ngx_quic_ack_frame_t ack;
127 ngx_quic_crypto_frame_t crypto;
128 ngx_quic_new_conn_id_frame_t ncid;
129 ngx_quic_stream_frame_t stream;
130 ngx_quic_close_frame_t close;
131 } u;
132 u_char info[128]; // for debug
133 };
134
135
136 typedef struct {
137 ngx_log_t *log;
138
139 struct ngx_quic_secret_s *secret;
140 ngx_uint_t type;
141 ngx_uint_t *number;
142 ngx_uint_t flags;
143 uint32_t version;
144 ngx_str_t token;
145 enum ssl_encryption_level_t level;
146
147 /* filled in by parser */
148 ngx_buf_t *raw; /* udp datagram */
149
150 u_char *data; /* quic packet */
151 size_t len;
152
153 /* cleartext fields */
154 ngx_str_t dcid;
155 ngx_str_t scid;
156 uint64_t pn;
157 ngx_str_t payload; /* decrypted */
158 } ngx_quic_header_t;
159
160
161 u_char *ngx_quic_error_text(uint64_t error_code);
162
163 ngx_int_t ngx_quic_parse_long_header(ngx_quic_header_t *pkt);
164 size_t ngx_quic_create_long_header(ngx_quic_header_t *pkt, ngx_str_t *out,
165 size_t pkt_len, u_char **pnp);
166
167 ngx_int_t ngx_quic_parse_short_header(ngx_quic_header_t *pkt,
168 ngx_str_t *dcid);
169 ngx_int_t ngx_quic_parse_initial_header(ngx_quic_header_t *pkt);
170 ngx_int_t ngx_quic_parse_handshake_header(ngx_quic_header_t *pkt);
171
172 ssize_t ngx_quic_parse_frame(u_char *start, u_char *end,
173 ngx_quic_frame_t *frame);
174 ssize_t ngx_quic_create_frame(u_char *p, u_char *end, ngx_quic_frame_t *f);
175 size_t ngx_quic_frame_len(ngx_quic_frame_t *frame);
176
177 #endif /* _NGX_EVENT_QUIC_WIRE_H_INCLUDED_ */