summaryrefslogtreecommitdiffhomepage
path: root/src/event/ngx_event_quic.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/event/ngx_event_quic.c')
-rw-r--r--src/event/ngx_event_quic.c670
1 files changed, 35 insertions, 635 deletions
diff --git a/src/event/ngx_event_quic.c b/src/event/ngx_event_quic.c
index 410fa0fcd..000b8be8b 100644
--- a/src/event/ngx_event_quic.c
+++ b/src/event/ngx_event_quic.c
@@ -9,82 +9,6 @@
#include <ngx_event.h>
-/* 12.4. Frames and Frame Types */
-#define NGX_QUIC_FT_PADDING 0x00
-#define NGX_QUIC_FT_PING 0x01
-#define NGX_QUIC_FT_ACK 0x02
-#define NGX_QUIC_FT_ACK_ECN 0x03
-#define NGX_QUIC_FT_RESET_STREAM 0x04
-#define NGX_QUIC_FT_STOP_SENDING 0x05
-#define NGX_QUIC_FT_CRYPTO 0x06
-#define NGX_QUIC_FT_NEW_TOKEN 0x07
-#define NGX_QUIC_FT_STREAM0 0x08
-#define NGX_QUIC_FT_STREAM1 0x09
-#define NGX_QUIC_FT_STREAM2 0x0A
-#define NGX_QUIC_FT_STREAM3 0x0B
-#define NGX_QUIC_FT_STREAM4 0x0C
-#define NGX_QUIC_FT_STREAM5 0x0D
-#define NGX_QUIC_FT_STREAM6 0x0E
-#define NGX_QUIC_FT_STREAM7 0x0F
-#define NGX_QUIC_FT_MAX_DATA 0x10
-#define NGX_QUIC_FT_MAX_STREAM_DATA 0x11
-#define NGX_QUIC_FT_MAX_STREAMS 0x12
-#define NGX_QUIC_FT_MAX_STREAMS2 0x13 // XXX
-#define NGX_QUIC_FT_DATA_BLOCKED 0x14
-#define NGX_QUIC_FT_STREAM_DATA_BLOCKED 0x15
-#define NGX_QUIC_FT_STREAMS_BLOCKED 0x16
-#define NGX_QUIC_FT_STREAMS_BLOCKED2 0x17 // XXX
-#define NGX_QUIC_FT_NEW_CONNECTION_ID 0x18
-#define NGX_QUIC_FT_RETIRE_CONNECTION_ID 0x19
-#define NGX_QUIC_FT_PATH_CHALLENGE 0x1a
-#define NGX_QUIC_FT_PATH_RESPONSE 0x1b
-#define NGX_QUIC_FT_CONNECTION_CLOSE 0x1c
-#define NGX_QUIC_FT_CONNECTION_CLOSE2 0x1d // XXX
-#define NGX_QUIC_FT_HANDSHAKE_DONE 0x1e
-
-#define ngx_quic_stream_bit_off(val) (((val) & 0x04) ? 1 : 0)
-#define ngx_quic_stream_bit_len(val) (((val) & 0x02) ? 1 : 0)
-#define ngx_quic_stream_bit_fin(val) (((val) & 0x01) ? 1 : 0)
-
-
-#define NGX_QUIC_ERR_NO_ERROR 0x0
-#define NGX_QUIC_ERR_INTERNAL_ERROR 0x1
-#define NGX_QUIC_ERR_SERVER_BUSY 0x2
-#define NGX_QUIC_ERR_FLOW_CONTROL_ERROR 0x3
-#define NGX_QUIC_ERR_STREAM_LIMIT_ERROR 0x4
-#define NGX_QUIC_ERR_STREAM_STATE_ERROR 0x5
-#define NGX_QUIC_ERR_FINAL_SIZE_ERROR 0x6
-#define NGX_QUIC_ERR_FRAME_ENCODING_ERROR 0x7
-#define NGX_QUIC_ERR_TRANSPORT_PARAMETER_ERROR 0x8
-#define NGX_QUIC_ERR_CONNECTION_ID_LIMIT_ERROR 0x9
-#define NGX_QUIC_ERR_PROTOCOL_VIOLATION 0xA
-#define NGX_QUIC_ERR_INVALID_TOKEN 0xB
-/* 0xC is not defined */
-#define NGX_QUIC_ERR_CRYPTO_BUFFER_EXCEEDED 0xD
-#define NGX_QUIC_ERR_CRYPTO_ERROR 0x10
-
-#define NGX_QUIC_ERR_LAST NGX_QUIC_ERR_CRYPTO_ERROR
-
-/* literal errors indexed by corresponding value */
-static char *ngx_quic_errors[] = {
- "NO_ERROR",
- "INTERNAL_ERROR",
- "SERVER_BUSY",
- "FLOW_CONTROL_ERROR",
- "STREAM_LIMIT_ERROR",
- "STREAM_STATE_ERROR",
- "FINAL_SIZE_ERROR",
- "FRAME_ENCODING_ERROR",
- "TRANSPORT_PARAMETER_ERROR",
- "CONNECTION_ID_LIMIT_ERROR",
- "PROTOCOL_VIOLATION",
- "INVALID_TOKEN",
- "",
- "CRYPTO_BUFFER_EXCEEDED",
- "CRYPTO_ERROR",
-};
-
-
/* TODO: real states, these are stubs */
typedef enum {
NGX_QUIC_ST_INITIAL,
@@ -93,69 +17,6 @@ typedef enum {
} ngx_quic_state_t;
-typedef struct ngx_quic_frame_s ngx_quic_frame_t;
-
-typedef struct {
- ngx_uint_t pn;
-
- // input
- uint64_t largest;
- uint64_t delay;
- uint64_t range_count;
- uint64_t first_range;
- uint64_t ranges[20];
- /* ecn counts */
-} ngx_quic_ack_frame_t;
-
-typedef struct {
- size_t offset;
- size_t len;
- u_char *data;
-} ngx_quic_crypto_frame_t;
-
-
-typedef struct {
- uint64_t seqnum;
- uint64_t retire;
- uint64_t len;
- u_char cid[20];
- u_char srt[16];
-} ngx_quic_ncid_t;
-
-
-typedef struct {
- uint8_t type;
- uint64_t stream_id;
- uint64_t offset;
- uint64_t length;
- u_char *data;
-} ngx_quic_stream_frame_t;
-
-
-typedef struct {
- uint64_t error_code;
- uint64_t frame_type;
- ngx_str_t reason;
-} ngx_quic_close_frame_t;
-
-
-struct ngx_quic_frame_s {
- ngx_uint_t type;
- ngx_quic_level_t level;
- ngx_quic_frame_t *next;
- union {
- ngx_quic_crypto_frame_t crypto;
- ngx_quic_ack_frame_t ack;
- ngx_quic_ncid_t ncid;
- ngx_quic_stream_frame_t stream;
- ngx_quic_close_frame_t close;
- // more frames
- } u;
-
- u_char info[128]; // for debug purposes
-};
-
-
struct ngx_quic_connection_s {
ngx_quic_state_t state;
@@ -229,16 +90,6 @@ static int ngx_quic_flush_flight(ngx_ssl_conn_t *ssl_conn);
static int ngx_quic_send_alert(ngx_ssl_conn_t *ssl_conn,
enum ssl_encryption_level_t level, uint8_t alert);
-static ngx_int_t ngx_quic_process_long_header(ngx_connection_t *c,
- ngx_quic_header_t *pkt);
-static ngx_int_t ngx_quic_process_short_header(ngx_connection_t *c,
- ngx_quic_header_t *pkt);
-static ngx_int_t ngx_quic_process_initial_header(ngx_connection_t *c,
- ngx_quic_header_t *pkt);
-static ngx_int_t ngx_quic_process_handshake_header(ngx_connection_t *c,
- ngx_quic_header_t *pkt);
-
-static uint64_t ngx_quic_parse_int(u_char **pos);
static ssize_t ngx_quic_stream_recv(ngx_connection_t *c, u_char *buf,
size_t size);
@@ -282,6 +133,7 @@ ngx_quic_run(ngx_connection_t *c, ngx_ssl_t *ssl, ngx_msec_t timeout,
b = c->buffer;
+ pkt.log = c->log;
pkt.raw = b;
pkt.data = b->start;
pkt.len = b->last - b->start;
@@ -407,6 +259,7 @@ ngx_quic_input(ngx_connection_t *c, ngx_buf_t *b)
pkt.raw = b;
pkt.data = p;
pkt.len = b->last - p;
+ pkt.log = c->log;
if (p[0] == 0) {
/* XXX: no idea WTF is this, just ignore */
@@ -448,11 +301,13 @@ ngx_quic_input(ngx_connection_t *c, ngx_buf_t *b)
static ngx_int_t
ngx_quic_send_packet(ngx_connection_t *c, ngx_quic_connection_t *qc,
- ngx_quic_level_t level, ngx_str_t *payload)
+ enum ssl_encryption_level_t level, ngx_str_t *payload)
{
ngx_str_t res;
ngx_quic_header_t pkt;
+ pkt.log = c->log;
+
static ngx_str_t initial_token = ngx_null_string;
ngx_memzero(&pkt, sizeof(ngx_quic_header_t));
@@ -494,139 +349,12 @@ ngx_quic_send_packet(ngx_connection_t *c, ngx_quic_connection_t *qc,
}
-static size_t
-ngx_quic_create_ack(u_char *p, ngx_quic_ack_frame_t *ack)
-{
- size_t len;
-
- /* minimal ACK packet */
-
- if (p == NULL) {
- len = ngx_quic_varint_len(NGX_QUIC_FT_ACK);
- len += ngx_quic_varint_len(ack->pn);
- len += ngx_quic_varint_len(0);
- len += ngx_quic_varint_len(0);
- len += ngx_quic_varint_len(ack->pn);
-
- return len;
- }
-
- ngx_quic_build_int(&p, NGX_QUIC_FT_ACK);
- ngx_quic_build_int(&p, ack->pn);
- ngx_quic_build_int(&p, 0);
- ngx_quic_build_int(&p, 0);
- ngx_quic_build_int(&p, ack->pn);
-
- return 5;
-}
-
-
-static size_t
-ngx_quic_create_crypto(u_char *p, ngx_quic_crypto_frame_t *crypto)
-{
- size_t len;
- u_char *start;
-
- if (p == NULL) {
- len = ngx_quic_varint_len(NGX_QUIC_FT_CRYPTO);
- len += ngx_quic_varint_len(crypto->offset);
- len += ngx_quic_varint_len(crypto->len);
- len += crypto->len;
-
- return len;
- }
-
- start = p;
-
- ngx_quic_build_int(&p, NGX_QUIC_FT_CRYPTO);
- ngx_quic_build_int(&p, crypto->offset);
- ngx_quic_build_int(&p, crypto->len);
- p = ngx_cpymem(p, crypto->data, crypto->len);
-
- return p - start;
-}
-
-
-static size_t
-ngx_quic_create_stream(u_char *p, ngx_quic_stream_frame_t *sf)
-{
- size_t len;
- u_char *start;
-
- if (!ngx_quic_stream_bit_len(sf->type)) {
-#if 0
- ngx_log_error(NGX_LOG_INFO, c->log, 0,
- "attempt to generate a stream frame without length");
-#endif
- // XXX: handle error in caller
- return NGX_ERROR;
- }
-
- if (p == NULL) {
- len = ngx_quic_varint_len(sf->type);
-
- if (ngx_quic_stream_bit_off(sf->type)) {
- len += ngx_quic_varint_len(sf->offset);
- }
-
- len += ngx_quic_varint_len(sf->stream_id);
-
- /* length is always present in generated frames */
- len += ngx_quic_varint_len(sf->length);
-
- len += sf->length;
-
- return len;
- }
-
- start = p;
-
- ngx_quic_build_int(&p, sf->type);
- ngx_quic_build_int(&p, sf->stream_id);
-
- if (ngx_quic_stream_bit_off(sf->type)) {
- ngx_quic_build_int(&p, sf->offset);
- }
-
- /* length is always present in generated frames */
- ngx_quic_build_int(&p, sf->length);
-
- p = ngx_cpymem(p, sf->data, sf->length);
-
- return p - start;
-}
-
-
-size_t
-ngx_quic_frame_len(ngx_quic_frame_t *frame)
-{
- switch (frame->type) {
- case NGX_QUIC_FT_ACK:
- return ngx_quic_create_ack(NULL, &frame->u.ack);
- case NGX_QUIC_FT_CRYPTO:
- return ngx_quic_create_crypto(NULL, &frame->u.crypto);
-
- case NGX_QUIC_FT_STREAM0:
- case NGX_QUIC_FT_STREAM1:
- case NGX_QUIC_FT_STREAM2:
- case NGX_QUIC_FT_STREAM3:
- case NGX_QUIC_FT_STREAM4:
- case NGX_QUIC_FT_STREAM5:
- case NGX_QUIC_FT_STREAM6:
- case NGX_QUIC_FT_STREAM7:
- return ngx_quic_create_stream(NULL, &frame->u.stream);
- default:
- /* BUG: unsupported frame type generated */
- return 0;
- }
-}
-
-
/* pack a group of frames [start; end) into memory p and send as single packet */
ngx_int_t
ngx_quic_frames_send(ngx_connection_t *c, ngx_quic_frame_t *start,
ngx_quic_frame_t *end, size_t total)
{
+ ssize_t len;
u_char *p;
ngx_str_t out;
ngx_quic_frame_t *f;
@@ -645,30 +373,12 @@ ngx_quic_frames_send(ngx_connection_t *c, ngx_quic_frame_t *start,
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "frame: %s", f->info);
- switch (f->type) {
- case NGX_QUIC_FT_ACK:
- p += ngx_quic_create_ack(p, &f->u.ack);
- break;
-
- case NGX_QUIC_FT_CRYPTO:
- p += ngx_quic_create_crypto(p, &f->u.crypto);
- break;
-
- case NGX_QUIC_FT_STREAM0:
- case NGX_QUIC_FT_STREAM1:
- case NGX_QUIC_FT_STREAM2:
- case NGX_QUIC_FT_STREAM3:
- case NGX_QUIC_FT_STREAM4:
- case NGX_QUIC_FT_STREAM5:
- case NGX_QUIC_FT_STREAM6:
- case NGX_QUIC_FT_STREAM7:
- p += ngx_quic_create_stream(p, &f->u.stream);
- break;
-
- default:
- /* BUG: unsupported frame type generated */
+ len = ngx_quic_create_frame(p, p + total, f);
+ if (len == -1) {
return NGX_ERROR;
}
+
+ p += len;
}
out.len = p - out.data;
@@ -892,279 +602,6 @@ ngx_quic_send_alert(ngx_ssl_conn_t *ssl_conn, enum ssl_encryption_level_t level,
}
-static ngx_int_t
-ngx_quic_process_short_header(ngx_connection_t *c, ngx_quic_header_t *pkt)
-{
- u_char *p;
-
- p = pkt->data;
-
- ngx_quic_hexdump0(c->log, "short input", pkt->data, pkt->len);
-
- if ((p[0] & NGX_QUIC_PKT_LONG)) {
- ngx_log_error(NGX_LOG_INFO, c->log, 0, "not a short packet");
- return NGX_ERROR;
- }
-
- pkt->flags = *p++;
-
- ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
- "quic flags:%xi", pkt->flags);
-
- if (ngx_memcmp(p, c->quic->dcid.data, c->quic->dcid.len) != 0) {
- ngx_log_error(NGX_LOG_INFO, c->log, 0, "unexpected quic dcid");
- return NGX_ERROR;
- }
-
- pkt->dcid.len = c->quic->dcid.len;
- pkt->dcid.data = p;
- p += pkt->dcid.len;
-
- pkt->raw->pos = p;
-
- return NGX_OK;
-}
-
-
-static ngx_int_t
-ngx_quic_process_long_header(ngx_connection_t *c, ngx_quic_header_t *pkt)
-{
- u_char *p;
-
- p = pkt->data;
-
- ngx_quic_hexdump0(c->log, "long input", pkt->data, pkt->len);
-
- if (!(p[0] & NGX_QUIC_PKT_LONG)) {
- ngx_log_error(NGX_LOG_INFO, c->log, 0, "not a long packet");
- return NGX_ERROR;
- }
-
- pkt->flags = *p++;
-
- pkt->version = ngx_quic_parse_uint32(p);
- p += sizeof(uint32_t);
-
- ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
- "quic flags:%xi version:%xD", pkt->flags, pkt->version);
-
- if (pkt->version != quic_version) {
- ngx_log_error(NGX_LOG_INFO, c->log, 0, "unsupported quic version");
- return NGX_ERROR;
- }
-
- pkt->dcid.len = *p++;
- pkt->dcid.data = p;
- p += pkt->dcid.len;
-
- pkt->scid.len = *p++;
- pkt->scid.data = p;
- p += pkt->scid.len;
-
- pkt->raw->pos = p;
-
- return NGX_OK;
-}
-
-
-static ngx_int_t
-ngx_quic_process_initial_header(ngx_connection_t *c, ngx_quic_header_t *pkt)
-{
- u_char *p;
- ngx_int_t plen;
-
- p = pkt->raw->pos;
-
- pkt->token.len = ngx_quic_parse_int(&p);
- pkt->token.data = p;
-
- p += pkt->token.len;
-
- plen = ngx_quic_parse_int(&p);
-
- ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
- "quic packet length: %d", plen);
-
- if (plen > pkt->data + pkt->len - p) {
- ngx_log_error(NGX_LOG_INFO, c->log, 0, "truncated initial packet");
- return NGX_ERROR;
- }
-
- pkt->raw->pos = p;
- pkt->len = plen;
-
- ngx_quic_hexdump0(c->log, "DCID", pkt->dcid.data, pkt->dcid.len);
- ngx_quic_hexdump0(c->log, "SCID", pkt->scid.data, pkt->scid.len);
- ngx_quic_hexdump0(c->log, "token", pkt->token.data, pkt->token.len);
-
- ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
- "quic packet length: %d", plen);
-
- return NGX_OK;
-}
-
-static ngx_int_t
-ngx_quic_process_handshake_header(ngx_connection_t *c, ngx_quic_header_t *pkt)
-{
- u_char *p;
- ngx_int_t plen;
-
- p = pkt->raw->pos;
-
- plen = ngx_quic_parse_int(&p);
-
- ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
- "quic packet length: %d", plen);
-
- if (plen > pkt->data + pkt->len - p) {
- ngx_log_error(NGX_LOG_INFO, c->log, 0, "truncated handshake packet");
- return NGX_ERROR;
- }
-
- pkt->raw->pos = p;
- pkt->len = plen;
-
- ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
- "quic packet length: %d", plen);
-
- return NGX_OK;
-}
-
-
-ssize_t
-ngx_quic_read_frame(ngx_connection_t *c, u_char *start, u_char *end,
- ngx_quic_frame_t *frame)
-{
- u_char *p;
-
- size_t npad;
-
- p = start;
-
- frame->type = *p++; // TODO: check overflow (p < end)
-
- switch (frame->type) {
-
- case NGX_QUIC_FT_CRYPTO:
- frame->u.crypto.offset = *p++;
- frame->u.crypto.len = ngx_quic_parse_int(&p);
- frame->u.crypto.data = p;
- p += frame->u.crypto.len;
-
- ngx_quic_hexdump0(c->log, "CRYPTO frame",
- frame->u.crypto.data, frame->u.crypto.len);
-
- ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
- "quic CRYPTO frame length: %uL off:%uL pp:%p",
- frame->u.crypto.len, frame->u.crypto.offset,
- frame->u.crypto.data);
- break;
-
- case NGX_QUIC_FT_PADDING:
- npad = 0;
- while (p < end && *p == NGX_QUIC_FT_PADDING) { // XXX
- p++; npad++;
- }
-
- ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
- "PADDING frame length %uL", npad);
-
- break;
-
- case NGX_QUIC_FT_ACK:
- case NGX_QUIC_FT_ACK_ECN:
-
- ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "ACK frame");
-
- frame->u.ack.largest = ngx_quic_parse_int(&p);
- frame->u.ack.delay = ngx_quic_parse_int(&p);
- frame->u.ack.range_count =ngx_quic_parse_int(&p);
- frame->u.ack.first_range =ngx_quic_parse_int(&p);
-
- if (frame->u.ack.range_count) {
- frame->u.ack.ranges[0] = ngx_quic_parse_int(&p);
- }
-
- if (frame->type ==NGX_QUIC_FT_ACK_ECN) {
- return NGX_ERROR;
- }
-
- break;
-
- case NGX_QUIC_FT_PING:
- ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "PING frame");
- break;
-
- case NGX_QUIC_FT_NEW_CONNECTION_ID:
- ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "NCID frame");
-
- frame->u.ncid.seqnum = ngx_quic_parse_int(&p);
- frame->u.ncid.retire = ngx_quic_parse_int(&p);
- frame->u.ncid.len = *p++;
- ngx_memcpy(frame->u.ncid.cid, p, frame->u.ncid.len);
- p += frame->u.ncid.len;
-
- ngx_memcpy(frame->u.ncid.srt, p, 16);
- p += 16;
-
- break;
-
- case NGX_QUIC_FT_CONNECTION_CLOSE:
- ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "connection close frame");
-
- frame->u.close.error_code = ngx_quic_parse_int(&p);
- frame->u.close.frame_type = ngx_quic_parse_int(&p); // not in 0x1d CC
- frame->u.close.reason.len = ngx_quic_parse_int(&p);
- frame->u.close.reason.data = p;
- p += frame->u.close.reason.len;
-
- if (frame->u.close.error_code > NGX_QUIC_ERR_LAST) {
- frame->u.close.error_code = NGX_QUIC_ERR_LAST;
- }
- break;
-
- case NGX_QUIC_FT_STREAM0:
- case NGX_QUIC_FT_STREAM1:
- case NGX_QUIC_FT_STREAM2:
- case NGX_QUIC_FT_STREAM3:
- case NGX_QUIC_FT_STREAM4:
- case NGX_QUIC_FT_STREAM5:
- case NGX_QUIC_FT_STREAM6:
- case NGX_QUIC_FT_STREAM7:
-
- ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
- "STREAM frame, type: 0x%xi", frame->type);
-
- frame->u.stream.type = frame->type;
-
- frame->u.stream.stream_id = ngx_quic_parse_int(&p);
- if (frame->type & 0x04) {
- frame->u.stream.offset = ngx_quic_parse_int(&p);
- } else {
- frame->u.stream.offset = 0;
- }
-
- if (frame->type & 0x02) {
- frame->u.stream.length = ngx_quic_parse_int(&p);
- } else {
- frame->u.stream.length = end - p; /* up to packet end */
- }
-
- frame->u.stream.data = p;
-
- p += frame->u.stream.length;
-
- break;
-
- default:
- ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
- "unknown frame type %xi", frame->type);
- return NGX_ERROR;
- }
-
- return p - start;
-}
-
static ngx_int_t
ngx_quic_handle_crypto_frame(ngx_connection_t *c, ngx_quic_header_t *pkt,
@@ -1349,6 +786,9 @@ ngx_quic_stream_send(ngx_connection_t *c, u_char *buf, size_t size)
frame->level = ssl_encryption_application;
frame->type = NGX_QUIC_FT_STREAM6; /* OFF=1 LEN=1 FIN=0 */
+ frame->u.stream.off = 1;
+ frame->u.stream.len = 1;
+ frame->u.stream.fin = 0;
frame->u.stream.type = frame->type;
frame->u.stream.stream_id = qs->id;
@@ -1433,8 +873,11 @@ ngx_quic_payload_handler(ngx_connection_t *c, ngx_quic_header_t *pkt)
while (p < end) {
- len = ngx_quic_read_frame(c, p, end, &frame);
+ len = ngx_quic_parse_frame(p, end, &frame);
if (len < 0) {
+ ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
+ "unknown frame type %xi", frame.type);
+ // XXX: log here
return NGX_ERROR;
}
@@ -1456,6 +899,13 @@ ngx_quic_payload_handler(ngx_connection_t *c, ngx_quic_header_t *pkt)
break;
case NGX_QUIC_FT_CRYPTO:
+ ngx_quic_hexdump0(c->log, "CRYPTO frame",
+ frame.u.crypto.data, frame.u.crypto.len);
+
+ ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
+ "quic CRYPTO frame length: %uL off:%uL pp:%p",
+ frame.u.crypto.len, frame.u.crypto.offset,
+ frame.u.crypto.data);
if (frame.u.crypto.offset != 0x0) {
ngx_log_error(NGX_LOG_INFO, c->log, 0,
@@ -1491,7 +941,7 @@ ngx_quic_payload_handler(ngx_connection_t *c, ngx_quic_header_t *pkt)
case NGX_QUIC_FT_CONNECTION_CLOSE:
ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,
"CONN.CLOSE: { %s (0x%xi) type=0x%xi reason='%V'}",
- ngx_quic_errors[frame.u.close.error_code],
+ ngx_quic_error_text(frame.u.close.error_code),
frame.u.close.error_code,
frame.u.close.frame_type,
&frame.u.close.reason);
@@ -1516,10 +966,9 @@ ngx_quic_payload_handler(ngx_connection_t *c, ngx_quic_header_t *pkt)
frame.u.stream.stream_id,
frame.u.stream.offset,
frame.u.stream.length,
- ngx_quic_stream_bit_off(frame.u.stream.type),
- ngx_quic_stream_bit_len(frame.u.stream.type),
- ngx_quic_stream_bit_fin(frame.u.stream.type));
-
+ frame.u.stream.off,
+ frame.u.stream.len,
+ frame.u.stream.fin);
sn = ngx_quic_stream_lookup(&qc->stree, frame.u.stream.stream_id);
if (sn == NULL) {
@@ -1727,7 +1176,7 @@ ngx_quic_new_connection(ngx_connection_t *c, ngx_ssl_t *ssl,
return NGX_ERROR;
}
- if (ngx_quic_process_long_header(c, pkt) != NGX_OK) {
+ if (ngx_quic_parse_long_header(pkt) != NGX_OK) {
return NGX_ERROR;
}
@@ -1737,7 +1186,7 @@ ngx_quic_new_connection(ngx_connection_t *c, ngx_ssl_t *ssl,
return NGX_ERROR;
}
- if (ngx_quic_process_initial_header(c, pkt) != NGX_OK) {
+ if (ngx_quic_parse_initial_header(pkt) != NGX_OK) {
return NGX_ERROR;
}
@@ -1804,11 +1253,11 @@ ngx_quic_initial_input(ngx_connection_t *c, ngx_quic_header_t *pkt)
qc = c->quic;
ssl_conn = c->ssl->connection;
- if (ngx_quic_process_long_header(c, pkt) != NGX_OK) {
+ if (ngx_quic_parse_long_header(pkt) != NGX_OK) {
return NGX_ERROR;
}
- if (ngx_quic_process_initial_header(c, pkt) != NGX_OK) {
+ if (ngx_quic_parse_initial_header(pkt) != NGX_OK) {
return NGX_ERROR;
}
@@ -1833,7 +1282,7 @@ ngx_quic_handshake_input(ngx_connection_t *c, ngx_quic_header_t *pkt)
ssl_conn = c->ssl->connection;
/* extract cleartext data into pkt */
- if (ngx_quic_process_long_header(c, pkt) != NGX_OK) {
+ if (ngx_quic_parse_long_header(pkt) != NGX_OK) {
return NGX_ERROR;
}
@@ -1863,7 +1312,7 @@ ngx_quic_handshake_input(ngx_connection_t *c, ngx_quic_header_t *pkt)
return NGX_ERROR;
}
- if (ngx_quic_process_handshake_header(c, pkt) != NGX_OK) {
+ if (ngx_quic_parse_handshake_header(pkt) != NGX_OK) {
return NGX_ERROR;
}
@@ -1891,7 +1340,7 @@ ngx_quic_app_input(ngx_connection_t *c, ngx_quic_header_t *pkt)
return NGX_DECLINED;
}
- if (ngx_quic_process_short_header(c, pkt) != NGX_OK) {
+ if (ngx_quic_parse_short_header(pkt, &qc->dcid) != NGX_OK) {
return NGX_ERROR;
}
@@ -1906,52 +1355,3 @@ ngx_quic_app_input(ngx_connection_t *c, ngx_quic_header_t *pkt)
}
-uint64_t
-ngx_quic_parse_int(u_char **pos)
-{
- u_char *p;
- uint64_t value;
- ngx_uint_t len;
-
- p = *pos;
- len = 1 << ((*p & 0xc0) >> 6);
- value = *p++ & 0x3f;
-
- while (--len) {
- value = (value << 8) + *p++;
- }
-
- *pos = p;
- return value;
-}
-
-
-void
-ngx_quic_build_int(u_char **pos, uint64_t value)
-{
- u_char *p;
- ngx_uint_t len;//, len2;
-
- p = *pos;
- len = 0;
-
- while (value >> ((1 << len) * 8 - 2)) {
- len++;
- }
-
- *p = len << 6;
-
-// len2 =
- len = (1 << len);
- len--;
- *p |= value >> (len * 8);
- p++;
-
- while (len) {
- *p++ = value >> ((len-- - 1) * 8);
- }
-
- *pos = p;
-// return len2;
-}
-