annotate src/event/ngx_event_quic_transport.c @ 8237:ff540f13d95d quic

MAX_DATA frame parser/handler.
author Sergey Kandaurov <pluknet@nginx.com>
date Wed, 18 Mar 2020 23:26:26 +0300
parents d3b26c3bea22
children 1f002206a59b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
2 /*
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
3 * Copyright (C) Nginx, Inc.
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
4 */
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
5
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
6
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
7 #include <ngx_config.h>
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
8 #include <ngx_core.h>
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
9 #include <ngx_event.h>
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
10
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
11
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
12 #if (NGX_HAVE_NONALIGNED)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
13
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
14 #define ngx_quic_parse_uint16(p) ntohs(*(uint16_t *) (p))
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
15 #define ngx_quic_parse_uint32(p) ntohl(*(uint32_t *) (p))
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
16
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
17 #define ngx_quic_write_uint16 ngx_quic_write_uint16_aligned
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
18 #define ngx_quic_write_uint32 ngx_quic_write_uint32_aligned
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
19
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
20 #else
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
21
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
22 #define ngx_quic_parse_uint16(p) ((p)[0] << 8 | (p)[1])
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
23 #define ngx_quic_parse_uint32(p) \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
24 ((uint32_t) (p)[0] << 24 | (p)[1] << 16 | (p)[2] << 8 | (p)[3])
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
25
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
26 #define ngx_quic_write_uint16(p, s) \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
27 ((p)[0] = (u_char) ((s) >> 8), \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
28 (p)[1] = (u_char) (s), \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
29 (p) + sizeof(uint16_t))
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
30
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
31 #define ngx_quic_write_uint32(p, s) \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
32 ((p)[0] = (u_char) ((s) >> 24), \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
33 (p)[1] = (u_char) ((s) >> 16), \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
34 (p)[2] = (u_char) ((s) >> 8), \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
35 (p)[3] = (u_char) (s), \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
36 (p) + sizeof(uint32_t))
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
37
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
38 #endif
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
39
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
40
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
41 #define ngx_quic_write_uint16_aligned(p, s) \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
42 (*(uint16_t *) (p) = htons((uint16_t) (s)), (p) + sizeof(uint16_t))
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
43
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
44 #define ngx_quic_write_uint32_aligned(p, s) \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
45 (*(uint32_t *) (p) = htonl((uint32_t) (s)), (p) + sizeof(uint32_t))
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
46
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
47 #define ngx_quic_varint_len(value) \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
48 ((value) <= 63 ? 1 \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
49 : ((uint32_t) value) <= 16383 ? 2 \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
50 : ((uint64_t) value) <= 1073741823 ? 4 \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
51 : 8)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
52
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
53
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
54 static uint64_t ngx_quic_parse_int(u_char **pos);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
55 static void ngx_quic_build_int(u_char **pos, uint64_t value);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
56
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
57 static size_t ngx_quic_create_ack(u_char *p, ngx_quic_ack_frame_t *ack);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
58 static size_t ngx_quic_create_crypto(u_char *p,
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
59 ngx_quic_crypto_frame_t *crypto);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
60 static size_t ngx_quic_create_stream(u_char *p, ngx_quic_stream_frame_t *sf);
8235
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
61 static size_t ngx_quic_create_close(u_char *p, ngx_quic_close_frame_t *cl);
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
62
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
63
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
64 /* literal errors indexed by corresponding value */
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
65 static char *ngx_quic_errors[] = {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
66 "NO_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
67 "INTERNAL_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
68 "SERVER_BUSY",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
69 "FLOW_CONTROL_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
70 "STREAM_LIMIT_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
71 "STREAM_STATE_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
72 "FINAL_SIZE_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
73 "FRAME_ENCODING_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
74 "TRANSPORT_PARAMETER_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
75 "CONNECTION_ID_LIMIT_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
76 "PROTOCOL_VIOLATION",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
77 "INVALID_TOKEN",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
78 "",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
79 "CRYPTO_BUFFER_EXCEEDED",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
80 "CRYPTO_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
81 };
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
82
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
83
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
84 static uint64_t
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
85 ngx_quic_parse_int(u_char **pos)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
86 {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
87 u_char *p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
88 uint64_t value;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
89 ngx_uint_t len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
90
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
91 p = *pos;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
92 len = 1 << ((*p & 0xc0) >> 6);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
93 value = *p++ & 0x3f;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
94
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
95 while (--len) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
96 value = (value << 8) + *p++;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
97 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
98
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
99 *pos = p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
100 return value;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
101 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
102
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
103
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
104 static void
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
105 ngx_quic_build_int(u_char **pos, uint64_t value)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
106 {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
107 u_char *p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
108 ngx_uint_t len;//, len2;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
109
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
110 p = *pos;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
111 len = 0;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
112
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
113 while (value >> ((1 << len) * 8 - 2)) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
114 len++;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
115 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
116
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
117 *p = len << 6;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
118
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
119 // len2 =
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
120 len = (1 << len);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
121 len--;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
122 *p |= value >> (len * 8);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
123 p++;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
124
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
125 while (len) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
126 *p++ = value >> ((len-- - 1) * 8);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
127 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
128
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
129 *pos = p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
130 // return len2;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
131 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
132
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
133
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
134 u_char *
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
135 ngx_quic_error_text(uint64_t error_code)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
136 {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
137 return (u_char *) ngx_quic_errors[error_code];
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
138 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
139
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
140
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
141 ngx_int_t
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
142 ngx_quic_parse_long_header(ngx_quic_header_t *pkt)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
143 {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
144 u_char *p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
145
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
146 p = pkt->data;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
147
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
148 ngx_quic_hexdump0(pkt->log, "long input", pkt->data, pkt->len);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
149
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
150 if (!(p[0] & NGX_QUIC_PKT_LONG)) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
151 ngx_log_error(NGX_LOG_INFO, pkt->log, 0, "not a long packet");
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
152 return NGX_ERROR;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
153 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
154
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
155 pkt->flags = *p++;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
156
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
157 pkt->version = ngx_quic_parse_uint32(p);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
158 p += sizeof(uint32_t);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
159
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
160 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
161 "quic flags:%xi version:%xD", pkt->flags, pkt->version);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
162
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
163 if (pkt->version != quic_version) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
164 ngx_log_error(NGX_LOG_INFO, pkt->log, 0, "unsupported quic version");
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
165 return NGX_ERROR;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
166 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
167
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
168 pkt->dcid.len = *p++;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
169 pkt->dcid.data = p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
170 p += pkt->dcid.len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
171
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
172 pkt->scid.len = *p++;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
173 pkt->scid.data = p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
174 p += pkt->scid.len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
175
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
176 pkt->raw->pos = p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
177
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
178 return NGX_OK;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
179 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
180
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
181
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
182 size_t
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
183 ngx_quic_create_long_header(ngx_quic_header_t *pkt, ngx_str_t *out,
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
184 size_t pkt_len, u_char **pnp)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
185 {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
186 u_char *p, *start;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
187
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
188 p = start = out->data;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
189
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
190 *p++ = pkt->flags;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
191
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
192 p = ngx_quic_write_uint32(p, quic_version);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
193
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
194 *p++ = pkt->scid.len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
195 p = ngx_cpymem(p, pkt->scid.data, pkt->scid.len);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
196
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
197 *p++ = pkt->dcid.len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
198 p = ngx_cpymem(p, pkt->dcid.data, pkt->dcid.len);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
199
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
200 if (pkt->level == ssl_encryption_initial) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
201 ngx_quic_build_int(&p, pkt->token.len);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
202 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
203
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
204 ngx_quic_build_int(&p, pkt_len + 1); // length (inc. pnl)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
205
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
206 *pnp = p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
207
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
208 *p++ = (uint64_t) (*pkt->number);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
209
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
210 return p - start;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
211 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
212
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
213
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
214 ngx_int_t
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
215 ngx_quic_parse_short_header(ngx_quic_header_t *pkt, ngx_str_t *dcid)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
216 {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
217 u_char *p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
218
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
219 p = pkt->data;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
220
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
221 ngx_quic_hexdump0(pkt->log, "short input", pkt->data, pkt->len);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
222
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
223 if ((p[0] & NGX_QUIC_PKT_LONG)) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
224 ngx_log_error(NGX_LOG_INFO, pkt->log, 0, "not a short packet");
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
225 return NGX_ERROR;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
226 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
227
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
228 pkt->flags = *p++;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
229
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
230 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
231 "quic flags:%xi", pkt->flags);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
232
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
233 if (ngx_memcmp(p, dcid->data, dcid->len) != 0) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
234 ngx_log_error(NGX_LOG_INFO, pkt->log, 0, "unexpected quic dcid");
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
235 return NGX_ERROR;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
236 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
237
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
238 pkt->dcid.len = dcid->len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
239 pkt->dcid.data = p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
240 p += pkt->dcid.len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
241
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
242 pkt->raw->pos = p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
243
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
244 return NGX_OK;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
245 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
246
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
247
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
248 ngx_int_t
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
249 ngx_quic_parse_initial_header(ngx_quic_header_t *pkt)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
250 {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
251 u_char *p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
252 ngx_int_t plen;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
253
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
254 p = pkt->raw->pos;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
255
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
256 pkt->token.len = ngx_quic_parse_int(&p);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
257 pkt->token.data = p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
258
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
259 p += pkt->token.len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
260
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
261 plen = ngx_quic_parse_int(&p);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
262
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
263 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
264 "quic packet length: %d", plen);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
265
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
266 if (plen > pkt->data + pkt->len - p) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
267 ngx_log_error(NGX_LOG_INFO, pkt->log, 0, "truncated initial packet");
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
268 return NGX_ERROR;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
269 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
270
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
271 pkt->raw->pos = p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
272 pkt->len = plen;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
273
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
274 ngx_quic_hexdump0(pkt->log, "DCID", pkt->dcid.data, pkt->dcid.len);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
275 ngx_quic_hexdump0(pkt->log, "SCID", pkt->scid.data, pkt->scid.len);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
276 ngx_quic_hexdump0(pkt->log, "token", pkt->token.data, pkt->token.len);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
277
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
278 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
279 "quic packet length: %d", plen);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
280
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
281 return NGX_OK;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
282 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
283
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
284
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
285 ngx_int_t
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
286 ngx_quic_parse_handshake_header(ngx_quic_header_t *pkt)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
287 {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
288 u_char *p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
289 ngx_int_t plen;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
290
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
291 p = pkt->raw->pos;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
292
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
293 plen = ngx_quic_parse_int(&p);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
294
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
295 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
296 "quic packet length: %d", plen);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
297
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
298 if (plen > pkt->data + pkt->len - p) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
299 ngx_log_error(NGX_LOG_INFO, pkt->log, 0, "truncated handshake packet");
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
300 return NGX_ERROR;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
301 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
302
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
303 pkt->raw->pos = p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
304 pkt->len = plen;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
305
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
306 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
307 "quic packet length: %d", plen);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
308
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
309 return NGX_OK;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
310 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
311
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
312
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
313 #define ngx_quic_stream_bit_off(val) (((val) & 0x04) ? 1 : 0)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
314 #define ngx_quic_stream_bit_len(val) (((val) & 0x02) ? 1 : 0)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
315 #define ngx_quic_stream_bit_fin(val) (((val) & 0x01) ? 1 : 0)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
316
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
317 ssize_t
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
318 ngx_quic_parse_frame(u_char *start, u_char *end, ngx_quic_frame_t *frame)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
319 {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
320 u_char *p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
321
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
322 size_t npad;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
323
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
324 p = start;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
325
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
326 frame->type = *p++; // TODO: check overflow (p < end)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
327
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
328 switch (frame->type) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
329
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
330 case NGX_QUIC_FT_CRYPTO:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
331 frame->u.crypto.offset = *p++;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
332 frame->u.crypto.len = ngx_quic_parse_int(&p);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
333 frame->u.crypto.data = p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
334 p += frame->u.crypto.len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
335
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
336 break;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
337
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
338 case NGX_QUIC_FT_PADDING:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
339 npad = 0;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
340 while (p < end && *p == NGX_QUIC_FT_PADDING) { // XXX
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
341 p++; npad++;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
342 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
343
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
344 break;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
345
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
346 case NGX_QUIC_FT_ACK:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
347 case NGX_QUIC_FT_ACK_ECN:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
348
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
349 frame->u.ack.largest = ngx_quic_parse_int(&p);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
350 frame->u.ack.delay = ngx_quic_parse_int(&p);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
351 frame->u.ack.range_count =ngx_quic_parse_int(&p);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
352 frame->u.ack.first_range =ngx_quic_parse_int(&p);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
353
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
354 if (frame->u.ack.range_count) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
355 frame->u.ack.ranges[0] = ngx_quic_parse_int(&p);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
356 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
357
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
358 if (frame->type ==NGX_QUIC_FT_ACK_ECN) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
359 return NGX_ERROR;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
360 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
361
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
362 break;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
363
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
364 case NGX_QUIC_FT_PING:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
365 break;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
366
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
367 case NGX_QUIC_FT_NEW_CONNECTION_ID:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
368
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
369 frame->u.ncid.seqnum = ngx_quic_parse_int(&p);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
370 frame->u.ncid.retire = ngx_quic_parse_int(&p);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
371 frame->u.ncid.len = *p++;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
372 ngx_memcpy(frame->u.ncid.cid, p, frame->u.ncid.len);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
373 p += frame->u.ncid.len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
374
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
375 ngx_memcpy(frame->u.ncid.srt, p, 16);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
376 p += 16;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
377
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
378 break;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
379
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
380 case NGX_QUIC_FT_CONNECTION_CLOSE:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
381
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
382 frame->u.close.error_code = ngx_quic_parse_int(&p);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
383 frame->u.close.frame_type = ngx_quic_parse_int(&p); // not in 0x1d CC
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
384 frame->u.close.reason.len = ngx_quic_parse_int(&p);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
385 frame->u.close.reason.data = p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
386 p += frame->u.close.reason.len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
387
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
388 if (frame->u.close.error_code > NGX_QUIC_ERR_LAST) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
389 frame->u.close.error_code = NGX_QUIC_ERR_LAST;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
390 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
391 break;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
392
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
393 case NGX_QUIC_FT_STREAM0:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
394 case NGX_QUIC_FT_STREAM1:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
395 case NGX_QUIC_FT_STREAM2:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
396 case NGX_QUIC_FT_STREAM3:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
397 case NGX_QUIC_FT_STREAM4:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
398 case NGX_QUIC_FT_STREAM5:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
399 case NGX_QUIC_FT_STREAM6:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
400 case NGX_QUIC_FT_STREAM7:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
401
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
402 frame->u.stream.type = frame->type;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
403
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
404 frame->u.stream.off = ngx_quic_stream_bit_off(frame->type);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
405 frame->u.stream.len = ngx_quic_stream_bit_len(frame->type);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
406 frame->u.stream.fin = ngx_quic_stream_bit_fin(frame->type);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
407
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
408 frame->u.stream.stream_id = ngx_quic_parse_int(&p);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
409 if (frame->type & 0x04) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
410 frame->u.stream.offset = ngx_quic_parse_int(&p);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
411 } else {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
412 frame->u.stream.offset = 0;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
413 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
414
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
415 if (frame->type & 0x02) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
416 frame->u.stream.length = ngx_quic_parse_int(&p);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
417 } else {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
418 frame->u.stream.length = end - p; /* up to packet end */
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
419 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
420
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
421 frame->u.stream.data = p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
422
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
423 p += frame->u.stream.length;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
424
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
425 break;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
426
8237
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8236
diff changeset
427 case NGX_QUIC_FT_MAX_DATA:
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8236
diff changeset
428 frame->u.max_data.max_data = ngx_quic_parse_int(&p);
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8236
diff changeset
429 break;
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8236
diff changeset
430
8231
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
431 case NGX_QUIC_FT_RESET_STREAM:
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
432 frame->u.reset_stream.id = ngx_quic_parse_int(&p);
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
433 frame->u.reset_stream.error_code = ngx_quic_parse_int(&p);
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
434 frame->u.reset_stream.final_size = ngx_quic_parse_int(&p);
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
435 break;
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
436
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
437 case NGX_QUIC_FT_STOP_SENDING:
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
438 frame->u.stop_sending.id = ngx_quic_parse_int(&p);
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
439 frame->u.stop_sending.error_code = ngx_quic_parse_int(&p);
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
440 break;
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
441
8236
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
442 case NGX_QUIC_FT_STREAMS_BLOCKED:
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
443 frame->u.streams_blocked.limit = ngx_quic_parse_int(&p);
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
444 frame->u.streams_blocked.bidi = 1;
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
445 break;
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
446
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
447 case NGX_QUIC_FT_STREAMS_BLOCKED2:
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
448 frame->u.streams_blocked.limit = ngx_quic_parse_int(&p);
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
449 frame->u.streams_blocked.bidi = 0;
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
450 break;
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
451
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
452 default:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
453 return NGX_ERROR;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
454 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
455
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
456 return p - start;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
457 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
458
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
459
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
460 ssize_t
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
461 ngx_quic_create_frame(u_char *p, u_char *end, ngx_quic_frame_t *f)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
462 {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
463 // TODO: handle end arg
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
464
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
465 switch (f->type) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
466 case NGX_QUIC_FT_ACK:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
467 return ngx_quic_create_ack(p, &f->u.ack);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
468
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
469 case NGX_QUIC_FT_CRYPTO:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
470 return ngx_quic_create_crypto(p, &f->u.crypto);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
471
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
472 case NGX_QUIC_FT_STREAM0:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
473 case NGX_QUIC_FT_STREAM1:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
474 case NGX_QUIC_FT_STREAM2:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
475 case NGX_QUIC_FT_STREAM3:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
476 case NGX_QUIC_FT_STREAM4:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
477 case NGX_QUIC_FT_STREAM5:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
478 case NGX_QUIC_FT_STREAM6:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
479 case NGX_QUIC_FT_STREAM7:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
480 return ngx_quic_create_stream(p, &f->u.stream);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
481
8235
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
482 case NGX_QUIC_FT_CONNECTION_CLOSE:
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
483 return ngx_quic_create_close(p, &f->u.close);
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
484
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
485 default:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
486 /* BUG: unsupported frame type generated */
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
487 return NGX_ERROR;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
488 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
489 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
490
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
491
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
492 size_t
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
493 ngx_quic_frame_len(ngx_quic_frame_t *frame)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
494 {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
495 switch (frame->type) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
496 case NGX_QUIC_FT_ACK:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
497 return ngx_quic_create_ack(NULL, &frame->u.ack);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
498 case NGX_QUIC_FT_CRYPTO:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
499 return ngx_quic_create_crypto(NULL, &frame->u.crypto);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
500
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
501 case NGX_QUIC_FT_STREAM0:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
502 case NGX_QUIC_FT_STREAM1:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
503 case NGX_QUIC_FT_STREAM2:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
504 case NGX_QUIC_FT_STREAM3:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
505 case NGX_QUIC_FT_STREAM4:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
506 case NGX_QUIC_FT_STREAM5:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
507 case NGX_QUIC_FT_STREAM6:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
508 case NGX_QUIC_FT_STREAM7:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
509 return ngx_quic_create_stream(NULL, &frame->u.stream);
8235
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
510 case NGX_QUIC_FT_CONNECTION_CLOSE:
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
511 return ngx_quic_create_close(NULL, &frame->u.close);
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
512 default:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
513 /* BUG: unsupported frame type generated */
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
514 return 0;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
515 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
516 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
517
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
518
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
519 static size_t
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
520 ngx_quic_create_ack(u_char *p, ngx_quic_ack_frame_t *ack)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
521 {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
522 size_t len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
523
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
524 /* minimal ACK packet */
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
525
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
526 if (p == NULL) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
527 len = ngx_quic_varint_len(NGX_QUIC_FT_ACK);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
528 len += ngx_quic_varint_len(ack->pn);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
529 len += ngx_quic_varint_len(0);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
530 len += ngx_quic_varint_len(0);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
531 len += ngx_quic_varint_len(ack->pn);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
532
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
533 return len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
534 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
535
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
536 ngx_quic_build_int(&p, NGX_QUIC_FT_ACK);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
537 ngx_quic_build_int(&p, ack->pn);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
538 ngx_quic_build_int(&p, 0);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
539 ngx_quic_build_int(&p, 0);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
540 ngx_quic_build_int(&p, ack->pn);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
541
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
542 return 5;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
543 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
544
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
545
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
546 static size_t
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
547 ngx_quic_create_crypto(u_char *p, ngx_quic_crypto_frame_t *crypto)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
548 {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
549 size_t len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
550 u_char *start;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
551
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
552 if (p == NULL) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
553 len = ngx_quic_varint_len(NGX_QUIC_FT_CRYPTO);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
554 len += ngx_quic_varint_len(crypto->offset);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
555 len += ngx_quic_varint_len(crypto->len);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
556 len += crypto->len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
557
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
558 return len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
559 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
560
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
561 start = p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
562
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
563 ngx_quic_build_int(&p, NGX_QUIC_FT_CRYPTO);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
564 ngx_quic_build_int(&p, crypto->offset);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
565 ngx_quic_build_int(&p, crypto->len);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
566 p = ngx_cpymem(p, crypto->data, crypto->len);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
567
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
568 return p - start;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
569 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
570
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
571
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
572 static size_t
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
573 ngx_quic_create_stream(u_char *p, ngx_quic_stream_frame_t *sf)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
574 {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
575 size_t len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
576 u_char *start;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
577
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
578 if (!sf->len) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
579 #if 0
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
580 ngx_log_error(NGX_LOG_INFO, log, 0,
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
581 "attempt to generate a stream frame without length");
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
582 #endif
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
583 // XXX: handle error in caller
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
584 return NGX_ERROR;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
585 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
586
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
587 if (p == NULL) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
588 len = ngx_quic_varint_len(sf->type);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
589
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
590 if (sf->off) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
591 len += ngx_quic_varint_len(sf->offset);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
592 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
593
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
594 len += ngx_quic_varint_len(sf->stream_id);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
595
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
596 /* length is always present in generated frames */
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
597 len += ngx_quic_varint_len(sf->length);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
598
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
599 len += sf->length;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
600
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
601 return len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
602 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
603
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
604 start = p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
605
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
606 ngx_quic_build_int(&p, sf->type);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
607 ngx_quic_build_int(&p, sf->stream_id);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
608
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
609 if (sf->off) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
610 ngx_quic_build_int(&p, sf->offset);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
611 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
612
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
613 /* length is always present in generated frames */
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
614 ngx_quic_build_int(&p, sf->length);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
615
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
616 p = ngx_cpymem(p, sf->data, sf->length);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
617
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
618 return p - start;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
619 }
8235
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
620
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
621
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
622 static size_t
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
623 ngx_quic_create_close(u_char *p, ngx_quic_close_frame_t *cl)
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
624 {
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
625 size_t len;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
626 u_char *start;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
627
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
628 if (p == NULL) {
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
629 len = ngx_quic_varint_len(NGX_QUIC_FT_CONNECTION_CLOSE);
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
630 len += ngx_quic_varint_len(cl->error_code);
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
631 len += ngx_quic_varint_len(cl->frame_type);
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
632 len += ngx_quic_varint_len(cl->reason.len);
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
633 len += cl->reason.len;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
634
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
635 return len;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
636 }
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
637
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
638 start = p;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
639
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
640 ngx_quic_build_int(&p, NGX_QUIC_FT_CONNECTION_CLOSE);
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
641 ngx_quic_build_int(&p, cl->error_code);
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
642 ngx_quic_build_int(&p, cl->frame_type);
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
643 ngx_quic_build_int(&p, cl->reason.len);
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
644 p = ngx_cpymem(p, cl->reason.data, cl->reason.len);
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
645
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
646 return p - start;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
647 }