Mercurial > hg > nginx-quic
comparison src/event/ngx_event_quic_transport.h @ 7690: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
7689:61f9b873e2e7 | 7690: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_ */ |