mirror of
https://github.com/nginx/nginx.git
synced 2025-02-25 18:55:26 -06:00
Added processing of CONNECTION CLOSE frames.
Contents is parsed and debug is output. No actions are taken.
This commit is contained in:
parent
5399670fcc
commit
0d8984083b
@ -129,12 +129,48 @@ do { \
|
|||||||
#define NGX_QUIC_FT_CONNECTION_CLOSE2 0x1d // XXX
|
#define NGX_QUIC_FT_CONNECTION_CLOSE2 0x1d // XXX
|
||||||
#define NGX_QUIC_FT_HANDSHAKE_DONE 0x1e
|
#define NGX_QUIC_FT_HANDSHAKE_DONE 0x1e
|
||||||
|
|
||||||
|
|
||||||
#define ngx_quic_stream_bit_off(val) (((val) & 0x04) ? 1 : 0)
|
#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_len(val) (((val) & 0x02) ? 1 : 0)
|
||||||
#define ngx_quic_stream_bit_fin(val) (((val) & 0x01) ? 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 */
|
/* TODO: real states, these are stubs */
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@ -198,6 +234,13 @@ typedef struct {
|
|||||||
} ngx_quic_stream_frame_t;
|
} 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 {
|
struct ngx_quic_frame_s {
|
||||||
ngx_uint_t type;
|
ngx_uint_t type;
|
||||||
ngx_quic_level_t level;
|
ngx_quic_level_t level;
|
||||||
@ -207,6 +250,7 @@ struct ngx_quic_frame_s {
|
|||||||
ngx_quic_ack_frame_t ack;
|
ngx_quic_ack_frame_t ack;
|
||||||
ngx_quic_ncid_t ncid;
|
ngx_quic_ncid_t ncid;
|
||||||
ngx_quic_stream_frame_t stream;
|
ngx_quic_stream_frame_t stream;
|
||||||
|
ngx_quic_close_frame_t close;
|
||||||
// more frames
|
// more frames
|
||||||
} u;
|
} u;
|
||||||
|
|
||||||
@ -1738,10 +1782,17 @@ ngx_quic_read_frame(ngx_connection_t *c, u_char *start, u_char *end,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case NGX_QUIC_FT_CONNECTION_CLOSE:
|
case NGX_QUIC_FT_CONNECTION_CLOSE:
|
||||||
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "connection close frame => NGX_ERROR");
|
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "connection close frame");
|
||||||
|
|
||||||
// TODO: parse connection close here
|
frame->u.close.error_code = ngx_quic_parse_int(&p);
|
||||||
return NGX_ERROR;
|
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;
|
break;
|
||||||
|
|
||||||
case NGX_QUIC_FT_STREAM0:
|
case NGX_QUIC_FT_STREAM0:
|
||||||
@ -2037,7 +2088,7 @@ ngx_quic_payload_handler(ngx_connection_t *c, ngx_quic_header_t *pkt)
|
|||||||
ssize_t len;
|
ssize_t len;
|
||||||
ngx_buf_t *b;
|
ngx_buf_t *b;
|
||||||
ngx_log_t *log;
|
ngx_log_t *log;
|
||||||
ngx_uint_t ack_this;
|
ngx_uint_t ack_this, do_close;
|
||||||
ngx_pool_t *pool;
|
ngx_pool_t *pool;
|
||||||
ngx_event_t *rev, *wev;
|
ngx_event_t *rev, *wev;
|
||||||
ngx_quic_frame_t frame, *ack_frame;
|
ngx_quic_frame_t frame, *ack_frame;
|
||||||
@ -2050,6 +2101,7 @@ ngx_quic_payload_handler(ngx_connection_t *c, ngx_quic_header_t *pkt)
|
|||||||
end = p + pkt->payload.len;
|
end = p + pkt->payload.len;
|
||||||
|
|
||||||
ack_this = 0;
|
ack_this = 0;
|
||||||
|
do_close = 0;
|
||||||
|
|
||||||
while (p < end) {
|
while (p < end) {
|
||||||
|
|
||||||
@ -2108,6 +2160,17 @@ ngx_quic_payload_handler(ngx_connection_t *c, ngx_quic_header_t *pkt)
|
|||||||
frame.u.ncid.len);
|
frame.u.ncid.len);
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
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],
|
||||||
|
frame.u.close.error_code,
|
||||||
|
frame.u.close.frame_type,
|
||||||
|
&frame.u.close.reason);
|
||||||
|
|
||||||
|
do_close = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
case NGX_QUIC_FT_STREAM0:
|
case NGX_QUIC_FT_STREAM0:
|
||||||
case NGX_QUIC_FT_STREAM1:
|
case NGX_QUIC_FT_STREAM1:
|
||||||
case NGX_QUIC_FT_STREAM2:
|
case NGX_QUIC_FT_STREAM2:
|
||||||
@ -2230,6 +2293,9 @@ ngx_quic_payload_handler(ngx_connection_t *c, ngx_quic_header_t *pkt)
|
|||||||
return NGX_ERROR;
|
return NGX_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (do_close) {
|
||||||
|
// TODO: handle stream close
|
||||||
|
}
|
||||||
|
|
||||||
if (ack_this == 0) {
|
if (ack_this == 0) {
|
||||||
/* do not ack packets with ACKs and PADDING */
|
/* do not ack packets with ACKs and PADDING */
|
||||||
|
Loading…
Reference in New Issue
Block a user