Mercurial > hg > nginx-quic
annotate src/event/quic/ngx_event_quic.h @ 8855:a5aebd51e4c7 quic
QUIC: stream lingering.
Now ngx_quic_stream_t is decoupled from ngx_connection_t in a way that it
can persist after connection is closed by application. During this period,
server is expecting stream final size from client for correct flow control.
Also, buffered output is sent to client as more flow control credit is granted.
author | Roman Arutyunyan <arut@nginx.com> |
---|---|
date | Sat, 05 Feb 2022 12:54:54 +0300 |
parents | 6c1dfd072859 |
children | f9c788f3f5cc |
rev | line source |
---|---|
7633
5d91389e0fd3
Initial QUIC support in http.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1 |
5d91389e0fd3
Initial QUIC support in http.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2 /* |
7648
b28ea685a56e
Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents:
7647
diff
changeset
|
3 * Copyright (C) Nginx, Inc. |
7633
5d91389e0fd3
Initial QUIC support in http.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
4 */ |
5d91389e0fd3
Initial QUIC support in http.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
5 |
5d91389e0fd3
Initial QUIC support in http.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
6 |
5d91389e0fd3
Initial QUIC support in http.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
7 #ifndef _NGX_EVENT_QUIC_H_INCLUDED_ |
5d91389e0fd3
Initial QUIC support in http.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
8 #define _NGX_EVENT_QUIC_H_INCLUDED_ |
5d91389e0fd3
Initial QUIC support in http.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
9 |
5d91389e0fd3
Initial QUIC support in http.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
10 |
7824
a5141e6b3214
Fixed includes in quic headers.
Roman Arutyunyan <arut@nginx.com>
parents:
7822
diff
changeset
|
11 #include <ngx_config.h> |
a5141e6b3214
Fixed includes in quic headers.
Roman Arutyunyan <arut@nginx.com>
parents:
7822
diff
changeset
|
12 #include <ngx_core.h> |
7636
53a5cdbe500c
QUIC add_handshake_data callback, varint routines.
Sergey Kandaurov <pluknet@nginx.com>
parents:
7635
diff
changeset
|
13 |
7687
69345a26ba69
Split transport and crypto parts into separate files.
Vladimir Homutov <vl@nginx.com>
parents:
7681
diff
changeset
|
14 |
7910
125cbfa77013
Renamed max_packet_size to max_udp_payload_size, from draft-28.
Sergey Kandaurov <pluknet@nginx.com>
parents:
7860
diff
changeset
|
15 #define NGX_QUIC_MAX_UDP_PAYLOAD_SIZE 65527 |
7927
391d06a51bc0
Limited max udp payload size for outgoing packets.
Vladimir Homutov <vl@nginx.com>
parents:
7913
diff
changeset
|
16 |
7731
d45325e90221
Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents:
7729
diff
changeset
|
17 #define NGX_QUIC_DEFAULT_ACK_DELAY_EXPONENT 3 |
d45325e90221
Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents:
7729
diff
changeset
|
18 #define NGX_QUIC_DEFAULT_MAX_ACK_DELAY 25 |
8287
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8279
diff
changeset
|
19 #define NGX_QUIC_DEFAULT_HOST_KEY_LEN 32 |
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8279
diff
changeset
|
20 #define NGX_QUIC_SR_KEY_LEN 32 |
cef042935003
QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents:
8279
diff
changeset
|
21 #define NGX_QUIC_AV_KEY_LEN 32 |
7731
d45325e90221
Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents:
7729
diff
changeset
|
22 |
8407 | 23 #define NGX_QUIC_SR_TOKEN_LEN 16 |
7832
ad3a6f069498
Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents:
7829
diff
changeset
|
24 |
7822
6481427ca3fc
Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents:
7811
diff
changeset
|
25 #define NGX_QUIC_MIN_INITIAL_SIZE 1200 |
6481427ca3fc
Respecting maximum packet size.
Vladimir Homutov <vl@nginx.com>
parents:
7811
diff
changeset
|
26 |
7746
b364af7f9f3f
Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents:
7739
diff
changeset
|
27 #define NGX_QUIC_STREAM_SERVER_INITIATED 0x01 |
b364af7f9f3f
Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents:
7739
diff
changeset
|
28 #define NGX_QUIC_STREAM_UNIDIRECTIONAL 0x02 |
b364af7f9f3f
Removed ngx_quic_stream_node_t.
Roman Arutyunyan <arut@nginx.com>
parents:
7739
diff
changeset
|
29 |
7713
e9891e8ee975
Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents:
7690
diff
changeset
|
30 |
8825
b42a041d23a2
QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents:
8814
diff
changeset
|
31 typedef enum { |
b42a041d23a2
QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents:
8814
diff
changeset
|
32 NGX_QUIC_STREAM_SEND_READY = 0, |
b42a041d23a2
QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents:
8814
diff
changeset
|
33 NGX_QUIC_STREAM_SEND_SEND, |
b42a041d23a2
QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents:
8814
diff
changeset
|
34 NGX_QUIC_STREAM_SEND_DATA_SENT, |
b42a041d23a2
QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents:
8814
diff
changeset
|
35 NGX_QUIC_STREAM_SEND_DATA_RECVD, |
b42a041d23a2
QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents:
8814
diff
changeset
|
36 NGX_QUIC_STREAM_SEND_RESET_SENT, |
b42a041d23a2
QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents:
8814
diff
changeset
|
37 NGX_QUIC_STREAM_SEND_RESET_RECVD |
b42a041d23a2
QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents:
8814
diff
changeset
|
38 } ngx_quic_stream_send_state_e; |
b42a041d23a2
QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents:
8814
diff
changeset
|
39 |
b42a041d23a2
QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents:
8814
diff
changeset
|
40 |
b42a041d23a2
QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents:
8814
diff
changeset
|
41 typedef enum { |
b42a041d23a2
QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents:
8814
diff
changeset
|
42 NGX_QUIC_STREAM_RECV_RECV = 0, |
b42a041d23a2
QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents:
8814
diff
changeset
|
43 NGX_QUIC_STREAM_RECV_SIZE_KNOWN, |
b42a041d23a2
QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents:
8814
diff
changeset
|
44 NGX_QUIC_STREAM_RECV_DATA_RECVD, |
b42a041d23a2
QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents:
8814
diff
changeset
|
45 NGX_QUIC_STREAM_RECV_DATA_READ, |
b42a041d23a2
QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents:
8814
diff
changeset
|
46 NGX_QUIC_STREAM_RECV_RESET_RECVD, |
b42a041d23a2
QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents:
8814
diff
changeset
|
47 NGX_QUIC_STREAM_RECV_RESET_READ |
b42a041d23a2
QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents:
8814
diff
changeset
|
48 } ngx_quic_stream_recv_state_e; |
b42a041d23a2
QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents:
8814
diff
changeset
|
49 |
b42a041d23a2
QUIC: introduced explicit stream states.
Roman Arutyunyan <arut@nginx.com>
parents:
8814
diff
changeset
|
50 |
7811
72d20158c814
Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents:
7748
diff
changeset
|
51 typedef struct { |
8827 | 52 ngx_ssl_t *ssl; |
8713
d6ef13c5fd8e
QUIC: simplified configuration.
Vladimir Homutov <vl@nginx.com>
parents:
8695
diff
changeset
|
53 |
8827 | 54 ngx_flag_t retry; |
55 ngx_flag_t gso_enabled; | |
56 ngx_flag_t disable_active_migration; | |
57 ngx_msec_t timeout; | |
58 ngx_str_t host_key; | |
59 size_t mtu; | |
60 size_t stream_buffer_size; | |
61 ngx_uint_t max_concurrent_streams_bidi; | |
62 ngx_uint_t max_concurrent_streams_uni; | |
63 ngx_uint_t active_connection_id_limit; | |
64 ngx_int_t stream_close_code; | |
65 ngx_int_t stream_reject_code_uni; | |
66 ngx_int_t stream_reject_code_bidi; | |
8713
d6ef13c5fd8e
QUIC: simplified configuration.
Vladimir Homutov <vl@nginx.com>
parents:
8695
diff
changeset
|
67 |
8827 | 68 u_char av_token_key[NGX_QUIC_AV_KEY_LEN]; |
69 u_char sr_token_key[NGX_QUIC_SR_KEY_LEN]; | |
7999
0d2b2664b41c
QUIC: added "quic" listen parameter.
Roman Arutyunyan <arut@nginx.com>
parents:
7998
diff
changeset
|
70 } ngx_quic_conf_t; |
0d2b2664b41c
QUIC: added "quic" listen parameter.
Roman Arutyunyan <arut@nginx.com>
parents:
7998
diff
changeset
|
71 |
0d2b2664b41c
QUIC: added "quic" listen parameter.
Roman Arutyunyan <arut@nginx.com>
parents:
7998
diff
changeset
|
72 |
7674
4ae9ac69ab93
HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents:
7648
diff
changeset
|
73 struct ngx_quic_stream_s { |
8827 | 74 ngx_rbtree_node_t node; |
75 ngx_queue_t queue; | |
76 ngx_connection_t *parent; | |
77 ngx_connection_t *connection; | |
78 uint64_t id; | |
79 uint64_t acked; | |
80 uint64_t send_max_data; | |
8855 | 81 uint64_t send_offset; |
82 uint64_t send_final_size; | |
8827 | 83 uint64_t recv_max_data; |
84 uint64_t recv_offset; | |
85 uint64_t recv_window; | |
86 uint64_t recv_last; | |
8847
6c1dfd072859
QUIC: switch stream to DATA_RECVD state.
Roman Arutyunyan <arut@nginx.com>
parents:
8827
diff
changeset
|
87 uint64_t recv_size; |
8855 | 88 uint64_t recv_final_size; |
8827 | 89 ngx_chain_t *in; |
90 ngx_chain_t *out; | |
91 ngx_uint_t cancelable; /* unsigned cancelable:1; */ | |
92 ngx_quic_stream_send_state_e send_state; | |
93 ngx_quic_stream_recv_state_e recv_state; | |
7674
4ae9ac69ab93
HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents:
7648
diff
changeset
|
94 }; |
4ae9ac69ab93
HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents:
7648
diff
changeset
|
95 |
7634 | 96 |
8101
bed310672f39
QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents:
8100
diff
changeset
|
97 void ngx_quic_run(ngx_connection_t *c, ngx_quic_conf_t *conf); |
8013
455a8536eaa7
QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents:
8001
diff
changeset
|
98 ngx_connection_t *ngx_quic_open_stream(ngx_connection_t *c, ngx_uint_t bidi); |
7953
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
7933
diff
changeset
|
99 void ngx_quic_finalize_connection(ngx_connection_t *c, ngx_uint_t err, |
e0f92f68e018
QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents:
7933
diff
changeset
|
100 const char *reason); |
8359
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8323
diff
changeset
|
101 void ngx_quic_shutdown_connection(ngx_connection_t *c, ngx_uint_t err, |
fc64ab301bad
QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents:
8323
diff
changeset
|
102 const char *reason); |
8296
d710c457171c
QUIC: added ability to reset a stream.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8287
diff
changeset
|
103 ngx_int_t ngx_quic_reset_stream(ngx_connection_t *c, ngx_uint_t err); |
8679
b4c7853b0488
QUIC: added shutdown support in stream proxy.
Vladimir Homutov <vl@nginx.com>
parents:
8617
diff
changeset
|
104 ngx_int_t ngx_quic_shutdown_stream(ngx_connection_t *c, int how); |
8617
9ae239d2547d
QUIC: separate event handling functions.
Roman Arutyunyan <arut@nginx.com>
parents:
8552
diff
changeset
|
105 ngx_int_t ngx_quic_handle_read_event(ngx_event_t *rev, ngx_uint_t flags); |
9ae239d2547d
QUIC: separate event handling functions.
Roman Arutyunyan <arut@nginx.com>
parents:
8552
diff
changeset
|
106 ngx_int_t ngx_quic_handle_write_event(ngx_event_t *wev, size_t lowat); |
8198
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8196
diff
changeset
|
107 ngx_int_t ngx_quic_get_packet_dcid(ngx_log_t *log, u_char *data, size_t len, |
45db1b5c1706
QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents:
8196
diff
changeset
|
108 ngx_str_t *dcid); |
8415
b4e6b7049984
QUIC: normalize header inclusion.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8414
diff
changeset
|
109 ngx_int_t ngx_quic_derive_key(ngx_log_t *log, const char *label, |
b4e6b7049984
QUIC: normalize header inclusion.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8414
diff
changeset
|
110 ngx_str_t *secret, ngx_str_t *salt, u_char *out, size_t len); |
7633
5d91389e0fd3
Initial QUIC support in http.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
111 |
5d91389e0fd3
Initial QUIC support in http.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
112 #endif /* _NGX_EVENT_QUIC_H_INCLUDED_ */ |