xref: /aosp_15_r20/external/libwebsockets/lib/roles/h2/private-lib-roles-h2.h (revision 1c60b9aca93fdbc9b5f19b2d2194c91294b22281)
1*1c60b9acSAndroid Build Coastguard Worker /*
2*1c60b9acSAndroid Build Coastguard Worker  * libwebsockets - small server side websockets and web server implementation
3*1c60b9acSAndroid Build Coastguard Worker  *
4*1c60b9acSAndroid Build Coastguard Worker  * Copyright (C) 2010 - 2019 Andy Green <[email protected]>
5*1c60b9acSAndroid Build Coastguard Worker  *
6*1c60b9acSAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a copy
7*1c60b9acSAndroid Build Coastguard Worker  * of this software and associated documentation files (the "Software"), to
8*1c60b9acSAndroid Build Coastguard Worker  * deal in the Software without restriction, including without limitation the
9*1c60b9acSAndroid Build Coastguard Worker  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10*1c60b9acSAndroid Build Coastguard Worker  * sell copies of the Software, and to permit persons to whom the Software is
11*1c60b9acSAndroid Build Coastguard Worker  * furnished to do so, subject to the following conditions:
12*1c60b9acSAndroid Build Coastguard Worker  *
13*1c60b9acSAndroid Build Coastguard Worker  * The above copyright notice and this permission notice shall be included in
14*1c60b9acSAndroid Build Coastguard Worker  * all copies or substantial portions of the Software.
15*1c60b9acSAndroid Build Coastguard Worker  *
16*1c60b9acSAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17*1c60b9acSAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*1c60b9acSAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19*1c60b9acSAndroid Build Coastguard Worker  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20*1c60b9acSAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21*1c60b9acSAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22*1c60b9acSAndroid Build Coastguard Worker  * IN THE SOFTWARE.
23*1c60b9acSAndroid Build Coastguard Worker  */
24*1c60b9acSAndroid Build Coastguard Worker 
25*1c60b9acSAndroid Build Coastguard Worker extern const struct lws_role_ops role_ops_h2;
26*1c60b9acSAndroid Build Coastguard Worker #define lwsi_role_h2(wsi) (wsi->role_ops == &role_ops_h2)
27*1c60b9acSAndroid Build Coastguard Worker 
28*1c60b9acSAndroid Build Coastguard Worker struct http2_settings {
29*1c60b9acSAndroid Build Coastguard Worker 	uint32_t s[H2SET_COUNT];
30*1c60b9acSAndroid Build Coastguard Worker };
31*1c60b9acSAndroid Build Coastguard Worker 
32*1c60b9acSAndroid Build Coastguard Worker struct lws_vhost_role_h2 {
33*1c60b9acSAndroid Build Coastguard Worker 	struct http2_settings set;
34*1c60b9acSAndroid Build Coastguard Worker };
35*1c60b9acSAndroid Build Coastguard Worker 
36*1c60b9acSAndroid Build Coastguard Worker enum lws_h2_wellknown_frame_types {
37*1c60b9acSAndroid Build Coastguard Worker 	LWS_H2_FRAME_TYPE_DATA,
38*1c60b9acSAndroid Build Coastguard Worker 	LWS_H2_FRAME_TYPE_HEADERS,
39*1c60b9acSAndroid Build Coastguard Worker 	LWS_H2_FRAME_TYPE_PRIORITY,
40*1c60b9acSAndroid Build Coastguard Worker 	LWS_H2_FRAME_TYPE_RST_STREAM,
41*1c60b9acSAndroid Build Coastguard Worker 	LWS_H2_FRAME_TYPE_SETTINGS,
42*1c60b9acSAndroid Build Coastguard Worker 	LWS_H2_FRAME_TYPE_PUSH_PROMISE,
43*1c60b9acSAndroid Build Coastguard Worker 	LWS_H2_FRAME_TYPE_PING,
44*1c60b9acSAndroid Build Coastguard Worker 	LWS_H2_FRAME_TYPE_GOAWAY,
45*1c60b9acSAndroid Build Coastguard Worker 	LWS_H2_FRAME_TYPE_WINDOW_UPDATE,
46*1c60b9acSAndroid Build Coastguard Worker 	LWS_H2_FRAME_TYPE_CONTINUATION,
47*1c60b9acSAndroid Build Coastguard Worker 
48*1c60b9acSAndroid Build Coastguard Worker 	LWS_H2_FRAME_TYPE_COUNT /* always last */
49*1c60b9acSAndroid Build Coastguard Worker };
50*1c60b9acSAndroid Build Coastguard Worker 
51*1c60b9acSAndroid Build Coastguard Worker enum lws_h2_flags {
52*1c60b9acSAndroid Build Coastguard Worker 	LWS_H2_FLAG_END_STREAM = 1,
53*1c60b9acSAndroid Build Coastguard Worker 	LWS_H2_FLAG_END_HEADERS = 4,
54*1c60b9acSAndroid Build Coastguard Worker 	LWS_H2_FLAG_PADDED = 8,
55*1c60b9acSAndroid Build Coastguard Worker 	LWS_H2_FLAG_PRIORITY = 0x20,
56*1c60b9acSAndroid Build Coastguard Worker 
57*1c60b9acSAndroid Build Coastguard Worker 	LWS_H2_FLAG_SETTINGS_ACK = 1,
58*1c60b9acSAndroid Build Coastguard Worker };
59*1c60b9acSAndroid Build Coastguard Worker 
60*1c60b9acSAndroid Build Coastguard Worker enum lws_h2_errors {
61*1c60b9acSAndroid Build Coastguard Worker 	H2_ERR_NO_ERROR,		   /* Graceful shutdown */
62*1c60b9acSAndroid Build Coastguard Worker 	H2_ERR_PROTOCOL_ERROR,	   /* Protocol error detected */
63*1c60b9acSAndroid Build Coastguard Worker 	H2_ERR_INTERNAL_ERROR,	   /* Implementation fault */
64*1c60b9acSAndroid Build Coastguard Worker 	H2_ERR_FLOW_CONTROL_ERROR,  /* Flow-control limits exceeded */
65*1c60b9acSAndroid Build Coastguard Worker 	H2_ERR_SETTINGS_TIMEOUT,	   /* Settings not acknowledged */
66*1c60b9acSAndroid Build Coastguard Worker 	H2_ERR_STREAM_CLOSED,	   /* Frame received for closed stream */
67*1c60b9acSAndroid Build Coastguard Worker 	H2_ERR_FRAME_SIZE_ERROR,	   /* Frame size incorrect */
68*1c60b9acSAndroid Build Coastguard Worker 	H2_ERR_REFUSED_STREAM,	   /* Stream not processed */
69*1c60b9acSAndroid Build Coastguard Worker 	H2_ERR_CANCEL,		   /* Stream cancelled */
70*1c60b9acSAndroid Build Coastguard Worker 	H2_ERR_COMPRESSION_ERROR,   /* Compression state not updated */
71*1c60b9acSAndroid Build Coastguard Worker 	H2_ERR_CONNECT_ERROR,	   /* TCP connection error for CONNECT method */
72*1c60b9acSAndroid Build Coastguard Worker 	H2_ERR_ENHANCE_YOUR_CALM,   /* Processing capacity exceeded */
73*1c60b9acSAndroid Build Coastguard Worker 	H2_ERR_INADEQUATE_SECURITY, /* Negotiated TLS parameters not acceptable */
74*1c60b9acSAndroid Build Coastguard Worker 	H2_ERR_HTTP_1_1_REQUIRED,   /* Use HTTP/1.1 for the request */
75*1c60b9acSAndroid Build Coastguard Worker };
76*1c60b9acSAndroid Build Coastguard Worker 
77*1c60b9acSAndroid Build Coastguard Worker enum lws_h2_states {
78*1c60b9acSAndroid Build Coastguard Worker 	LWS_H2_STATE_IDLE,
79*1c60b9acSAndroid Build Coastguard Worker 	/*
80*1c60b9acSAndroid Build Coastguard Worker 	 * Send PUSH_PROMISE    -> LWS_H2_STATE_RESERVED_LOCAL
81*1c60b9acSAndroid Build Coastguard Worker 	 * Recv PUSH_PROMISE    -> LWS_H2_STATE_RESERVED_REMOTE
82*1c60b9acSAndroid Build Coastguard Worker 	 * Send HEADERS         -> LWS_H2_STATE_OPEN
83*1c60b9acSAndroid Build Coastguard Worker 	 * Recv HEADERS         -> LWS_H2_STATE_OPEN
84*1c60b9acSAndroid Build Coastguard Worker 	 *
85*1c60b9acSAndroid Build Coastguard Worker 	 *  - Only PUSH_PROMISE + HEADERS valid to send
86*1c60b9acSAndroid Build Coastguard Worker 	 *  - Only HEADERS or PRIORITY valid to receive
87*1c60b9acSAndroid Build Coastguard Worker 	 */
88*1c60b9acSAndroid Build Coastguard Worker 	LWS_H2_STATE_RESERVED_LOCAL,
89*1c60b9acSAndroid Build Coastguard Worker 	/*
90*1c60b9acSAndroid Build Coastguard Worker 	 * Send RST_STREAM      -> LWS_H2_STATE_CLOSED
91*1c60b9acSAndroid Build Coastguard Worker 	 * Recv RST_STREAM      -> LWS_H2_STATE_CLOSED
92*1c60b9acSAndroid Build Coastguard Worker 	 * Send HEADERS         -> LWS_H2_STATE_HALF_CLOSED_REMOTE
93*1c60b9acSAndroid Build Coastguard Worker 	 *
94*1c60b9acSAndroid Build Coastguard Worker 	 * - Only HEADERS, RST_STREAM, or PRIORITY valid to send
95*1c60b9acSAndroid Build Coastguard Worker 	 * - Only RST_STREAM, PRIORITY, or WINDOW_UPDATE valid to receive
96*1c60b9acSAndroid Build Coastguard Worker 	 */
97*1c60b9acSAndroid Build Coastguard Worker 	LWS_H2_STATE_RESERVED_REMOTE,
98*1c60b9acSAndroid Build Coastguard Worker 	/*
99*1c60b9acSAndroid Build Coastguard Worker 	 * Send RST_STREAM      -> LWS_H2_STATE_CLOSED
100*1c60b9acSAndroid Build Coastguard Worker 	 * Recv RST_STREAM      -> LWS_H2_STATE_CLOSED
101*1c60b9acSAndroid Build Coastguard Worker 	 * Recv HEADERS         -> LWS_H2_STATE_HALF_CLOSED_LOCAL
102*1c60b9acSAndroid Build Coastguard Worker 	 *
103*1c60b9acSAndroid Build Coastguard Worker 	 *  - Only RST_STREAM, WINDOW_UPDATE, or PRIORITY valid to send
104*1c60b9acSAndroid Build Coastguard Worker 	 *  - Only HEADERS, RST_STREAM, or PRIORITY valid to receive
105*1c60b9acSAndroid Build Coastguard Worker 	 */
106*1c60b9acSAndroid Build Coastguard Worker 	LWS_H2_STATE_OPEN,
107*1c60b9acSAndroid Build Coastguard Worker 	/*
108*1c60b9acSAndroid Build Coastguard Worker 	 * Send RST_STREAM      -> LWS_H2_STATE_CLOSED
109*1c60b9acSAndroid Build Coastguard Worker 	 * Recv RST_STREAM      -> LWS_H2_STATE_CLOSED
110*1c60b9acSAndroid Build Coastguard Worker 	 * Send END_STREAM flag -> LWS_H2_STATE_HALF_CLOSED_LOCAL
111*1c60b9acSAndroid Build Coastguard Worker 	 * Recv END_STREAM flag -> LWS_H2_STATE_HALF_CLOSED_REMOTE
112*1c60b9acSAndroid Build Coastguard Worker 	 */
113*1c60b9acSAndroid Build Coastguard Worker 	LWS_H2_STATE_HALF_CLOSED_REMOTE,
114*1c60b9acSAndroid Build Coastguard Worker 	/*
115*1c60b9acSAndroid Build Coastguard Worker 	 * Send RST_STREAM      -> LWS_H2_STATE_CLOSED
116*1c60b9acSAndroid Build Coastguard Worker 	 * Recv RST_STREAM      -> LWS_H2_STATE_CLOSED
117*1c60b9acSAndroid Build Coastguard Worker 	 * Send END_STREAM flag -> LWS_H2_STATE_CLOSED
118*1c60b9acSAndroid Build Coastguard Worker 	 *
119*1c60b9acSAndroid Build Coastguard Worker 	 *  - Any frame valid to send
120*1c60b9acSAndroid Build Coastguard Worker 	 *  - Only WINDOW_UPDATE, PRIORITY, or RST_STREAM valid to receive
121*1c60b9acSAndroid Build Coastguard Worker 	 */
122*1c60b9acSAndroid Build Coastguard Worker 	LWS_H2_STATE_HALF_CLOSED_LOCAL,
123*1c60b9acSAndroid Build Coastguard Worker 	/*
124*1c60b9acSAndroid Build Coastguard Worker 	 * Send RST_STREAM      -> LWS_H2_STATE_CLOSED
125*1c60b9acSAndroid Build Coastguard Worker 	 * Recv RST_STREAM      -> LWS_H2_STATE_CLOSED
126*1c60b9acSAndroid Build Coastguard Worker 	 * Recv END_STREAM flag -> LWS_H2_STATE_CLOSED
127*1c60b9acSAndroid Build Coastguard Worker 	 *
128*1c60b9acSAndroid Build Coastguard Worker 	 *  - Only WINDOW_UPDATE, PRIORITY, and RST_STREAM valid to send
129*1c60b9acSAndroid Build Coastguard Worker 	 *  - Any frame valid to receive
130*1c60b9acSAndroid Build Coastguard Worker 	 */
131*1c60b9acSAndroid Build Coastguard Worker 	LWS_H2_STATE_CLOSED,
132*1c60b9acSAndroid Build Coastguard Worker 	/*
133*1c60b9acSAndroid Build Coastguard Worker 	 *  - Only PRIORITY, WINDOW_UPDATE (IGNORE) and RST_STREAM (IGNORE)
134*1c60b9acSAndroid Build Coastguard Worker 	 *     may be received
135*1c60b9acSAndroid Build Coastguard Worker 	 *
136*1c60b9acSAndroid Build Coastguard Worker 	 *  - Only PRIORITY valid to send
137*1c60b9acSAndroid Build Coastguard Worker 	 */
138*1c60b9acSAndroid Build Coastguard Worker };
139*1c60b9acSAndroid Build Coastguard Worker 
140*1c60b9acSAndroid Build Coastguard Worker void
141*1c60b9acSAndroid Build Coastguard Worker lws_h2_state(struct lws *wsi, enum lws_h2_states s);
142*1c60b9acSAndroid Build Coastguard Worker 
143*1c60b9acSAndroid Build Coastguard Worker #define LWS_H2_STREAM_ID_MASTER 0
144*1c60b9acSAndroid Build Coastguard Worker #define LWS_H2_SETTINGS_LEN 6
145*1c60b9acSAndroid Build Coastguard Worker #define LWS_H2_FLAG_SETTINGS_ACK 1
146*1c60b9acSAndroid Build Coastguard Worker 
147*1c60b9acSAndroid Build Coastguard Worker enum http2_hpack_state {
148*1c60b9acSAndroid Build Coastguard Worker 	HPKS_TYPE,
149*1c60b9acSAndroid Build Coastguard Worker 
150*1c60b9acSAndroid Build Coastguard Worker 	HPKS_IDX_EXT,
151*1c60b9acSAndroid Build Coastguard Worker 
152*1c60b9acSAndroid Build Coastguard Worker 	HPKS_HLEN,
153*1c60b9acSAndroid Build Coastguard Worker 	HPKS_HLEN_EXT,
154*1c60b9acSAndroid Build Coastguard Worker 
155*1c60b9acSAndroid Build Coastguard Worker 	HPKS_DATA,
156*1c60b9acSAndroid Build Coastguard Worker };
157*1c60b9acSAndroid Build Coastguard Worker 
158*1c60b9acSAndroid Build Coastguard Worker /*
159*1c60b9acSAndroid Build Coastguard Worker  * lws general parsimonious header strategy is only store values from known
160*1c60b9acSAndroid Build Coastguard Worker  * headers, and refer to them by index.
161*1c60b9acSAndroid Build Coastguard Worker  *
162*1c60b9acSAndroid Build Coastguard Worker  * That means if we can't map the peer header name to one that lws knows, we
163*1c60b9acSAndroid Build Coastguard Worker  * will drop the content but track the indexing with associated_lws_hdr_idx =
164*1c60b9acSAndroid Build Coastguard Worker  * LWS_HPACK_IGNORE_ENTRY.
165*1c60b9acSAndroid Build Coastguard Worker  */
166*1c60b9acSAndroid Build Coastguard Worker 
167*1c60b9acSAndroid Build Coastguard Worker enum http2_hpack_type {
168*1c60b9acSAndroid Build Coastguard Worker 	HPKT_INDEXED_HDR_7,		/* 1xxxxxxx: just "header field" */
169*1c60b9acSAndroid Build Coastguard Worker 	HPKT_INDEXED_HDR_6_VALUE_INCR,  /* 01xxxxxx: NEW indexed hdr with value */
170*1c60b9acSAndroid Build Coastguard Worker 	HPKT_LITERAL_HDR_VALUE_INCR,	/* 01000000: NEW literal hdr with value */
171*1c60b9acSAndroid Build Coastguard Worker 	HPKT_INDEXED_HDR_4_VALUE,	/* 0000xxxx: indexed hdr with value */
172*1c60b9acSAndroid Build Coastguard Worker 	HPKT_INDEXED_HDR_4_VALUE_NEVER,	/* 0001xxxx: indexed hdr with value NEVER NEW */
173*1c60b9acSAndroid Build Coastguard Worker 	HPKT_LITERAL_HDR_VALUE,		/* 00000000: literal hdr with value */
174*1c60b9acSAndroid Build Coastguard Worker 	HPKT_LITERAL_HDR_VALUE_NEVER,	/* 00010000: literal hdr with value NEVER NEW */
175*1c60b9acSAndroid Build Coastguard Worker 	HPKT_SIZE_5
176*1c60b9acSAndroid Build Coastguard Worker };
177*1c60b9acSAndroid Build Coastguard Worker 
178*1c60b9acSAndroid Build Coastguard Worker #define LWS_HPACK_IGNORE_ENTRY 0xffff
179*1c60b9acSAndroid Build Coastguard Worker 
180*1c60b9acSAndroid Build Coastguard Worker 
181*1c60b9acSAndroid Build Coastguard Worker struct hpack_dt_entry {
182*1c60b9acSAndroid Build Coastguard Worker 	char *value; /* malloc'd */
183*1c60b9acSAndroid Build Coastguard Worker 	uint16_t value_len;
184*1c60b9acSAndroid Build Coastguard Worker 	uint16_t hdr_len; /* virtual, for accounting */
185*1c60b9acSAndroid Build Coastguard Worker 	uint16_t lws_hdr_idx; /* LWS_HPACK_IGNORE_ENTRY = IGNORE */
186*1c60b9acSAndroid Build Coastguard Worker };
187*1c60b9acSAndroid Build Coastguard Worker 
188*1c60b9acSAndroid Build Coastguard Worker struct hpack_dynamic_table {
189*1c60b9acSAndroid Build Coastguard Worker 	struct hpack_dt_entry *entries; /* malloc'd */
190*1c60b9acSAndroid Build Coastguard Worker 	uint32_t virtual_payload_usage;
191*1c60b9acSAndroid Build Coastguard Worker 	uint32_t virtual_payload_max;
192*1c60b9acSAndroid Build Coastguard Worker 	uint16_t pos;
193*1c60b9acSAndroid Build Coastguard Worker 	uint16_t used_entries;
194*1c60b9acSAndroid Build Coastguard Worker 	uint16_t num_entries;
195*1c60b9acSAndroid Build Coastguard Worker };
196*1c60b9acSAndroid Build Coastguard Worker 
197*1c60b9acSAndroid Build Coastguard Worker enum lws_h2_protocol_send_type {
198*1c60b9acSAndroid Build Coastguard Worker 	LWS_PPS_NONE,
199*1c60b9acSAndroid Build Coastguard Worker 	LWS_H2_PPS_MY_SETTINGS,
200*1c60b9acSAndroid Build Coastguard Worker 	LWS_H2_PPS_ACK_SETTINGS,
201*1c60b9acSAndroid Build Coastguard Worker 	LWS_H2_PPS_PING,
202*1c60b9acSAndroid Build Coastguard Worker 	LWS_H2_PPS_PONG,
203*1c60b9acSAndroid Build Coastguard Worker 	LWS_H2_PPS_GOAWAY,
204*1c60b9acSAndroid Build Coastguard Worker 	LWS_H2_PPS_RST_STREAM,
205*1c60b9acSAndroid Build Coastguard Worker 	LWS_H2_PPS_UPDATE_WINDOW,
206*1c60b9acSAndroid Build Coastguard Worker 	LWS_H2_PPS_SETTINGS_INITIAL_UPDATE_WINDOW
207*1c60b9acSAndroid Build Coastguard Worker };
208*1c60b9acSAndroid Build Coastguard Worker 
209*1c60b9acSAndroid Build Coastguard Worker struct lws_h2_protocol_send {
210*1c60b9acSAndroid Build Coastguard Worker 	struct lws_h2_protocol_send *next; /* linked list */
211*1c60b9acSAndroid Build Coastguard Worker 	enum lws_h2_protocol_send_type type;
212*1c60b9acSAndroid Build Coastguard Worker 
213*1c60b9acSAndroid Build Coastguard Worker 	union uu {
214*1c60b9acSAndroid Build Coastguard Worker 		struct {
215*1c60b9acSAndroid Build Coastguard Worker 			char		str[32];
216*1c60b9acSAndroid Build Coastguard Worker 			uint32_t	highest_sid;
217*1c60b9acSAndroid Build Coastguard Worker 			uint32_t	err;
218*1c60b9acSAndroid Build Coastguard Worker 		} ga;
219*1c60b9acSAndroid Build Coastguard Worker 		struct {
220*1c60b9acSAndroid Build Coastguard Worker 			uint32_t	sid;
221*1c60b9acSAndroid Build Coastguard Worker 			uint32_t	err;
222*1c60b9acSAndroid Build Coastguard Worker 		} rs;
223*1c60b9acSAndroid Build Coastguard Worker 		struct {
224*1c60b9acSAndroid Build Coastguard Worker 			uint8_t		ping_payload[8];
225*1c60b9acSAndroid Build Coastguard Worker 		} ping;
226*1c60b9acSAndroid Build Coastguard Worker 		struct {
227*1c60b9acSAndroid Build Coastguard Worker 			uint32_t	sid;
228*1c60b9acSAndroid Build Coastguard Worker 			uint32_t	credit;
229*1c60b9acSAndroid Build Coastguard Worker 		} update_window;
230*1c60b9acSAndroid Build Coastguard Worker 	} u;
231*1c60b9acSAndroid Build Coastguard Worker };
232*1c60b9acSAndroid Build Coastguard Worker 
233*1c60b9acSAndroid Build Coastguard Worker struct lws_h2_ghost_sid {
234*1c60b9acSAndroid Build Coastguard Worker 	struct lws_h2_ghost_sid *next;
235*1c60b9acSAndroid Build Coastguard Worker 	uint32_t sid;
236*1c60b9acSAndroid Build Coastguard Worker };
237*1c60b9acSAndroid Build Coastguard Worker 
238*1c60b9acSAndroid Build Coastguard Worker /*
239*1c60b9acSAndroid Build Coastguard Worker  * http/2 connection info that is only used by the root connection that has
240*1c60b9acSAndroid Build Coastguard Worker  * the network connection.
241*1c60b9acSAndroid Build Coastguard Worker  *
242*1c60b9acSAndroid Build Coastguard Worker  * h2 tends to spawn many child connections from one network connection, so
243*1c60b9acSAndroid Build Coastguard Worker  * it's necessary to make members only needed by the network connection
244*1c60b9acSAndroid Build Coastguard Worker  * distinct and only malloc'd on network connections.
245*1c60b9acSAndroid Build Coastguard Worker  *
246*1c60b9acSAndroid Build Coastguard Worker  * There's only one HPACK parser per network connection.
247*1c60b9acSAndroid Build Coastguard Worker  *
248*1c60b9acSAndroid Build Coastguard Worker  * But there is an ah per logical child connection... the network connection
249*1c60b9acSAndroid Build Coastguard Worker  * fills it but it belongs to the logical child.
250*1c60b9acSAndroid Build Coastguard Worker  */
251*1c60b9acSAndroid Build Coastguard Worker struct lws_h2_netconn {
252*1c60b9acSAndroid Build Coastguard Worker 	struct http2_settings our_set;
253*1c60b9acSAndroid Build Coastguard Worker 	struct http2_settings peer_set;
254*1c60b9acSAndroid Build Coastguard Worker 	struct hpack_dynamic_table hpack_dyn_table;
255*1c60b9acSAndroid Build Coastguard Worker 	uint8_t	ping_payload[8];
256*1c60b9acSAndroid Build Coastguard Worker 	uint8_t one_setting[LWS_H2_SETTINGS_LEN];
257*1c60b9acSAndroid Build Coastguard Worker 	char goaway_str[32]; /* for rx */
258*1c60b9acSAndroid Build Coastguard Worker 	struct lws *swsi;
259*1c60b9acSAndroid Build Coastguard Worker 	struct lws_h2_protocol_send *pps; /* linked list */
260*1c60b9acSAndroid Build Coastguard Worker 
261*1c60b9acSAndroid Build Coastguard Worker 	enum http2_hpack_state hpack;
262*1c60b9acSAndroid Build Coastguard Worker 	enum http2_hpack_type hpack_type;
263*1c60b9acSAndroid Build Coastguard Worker 
264*1c60b9acSAndroid Build Coastguard Worker 	unsigned int huff:1;
265*1c60b9acSAndroid Build Coastguard Worker 	unsigned int value:1;
266*1c60b9acSAndroid Build Coastguard Worker 	unsigned int unknown_header:1;
267*1c60b9acSAndroid Build Coastguard Worker 	unsigned int cont_exp:1;
268*1c60b9acSAndroid Build Coastguard Worker 	unsigned int cont_exp_headers:1;
269*1c60b9acSAndroid Build Coastguard Worker 	unsigned int we_told_goaway:1;
270*1c60b9acSAndroid Build Coastguard Worker 	unsigned int pad_length:1;
271*1c60b9acSAndroid Build Coastguard Worker 	unsigned int collected_priority:1;
272*1c60b9acSAndroid Build Coastguard Worker 	unsigned int is_first_header_char:1;
273*1c60b9acSAndroid Build Coastguard Worker 	unsigned int zero_huff_padding:1;
274*1c60b9acSAndroid Build Coastguard Worker 	unsigned int last_action_dyntable_resize:1;
275*1c60b9acSAndroid Build Coastguard Worker 	unsigned int sent_preface:1;
276*1c60b9acSAndroid Build Coastguard Worker 
277*1c60b9acSAndroid Build Coastguard Worker 	uint32_t hdr_idx;
278*1c60b9acSAndroid Build Coastguard Worker 	uint32_t hpack_len;
279*1c60b9acSAndroid Build Coastguard Worker 	uint32_t hpack_e_dep;
280*1c60b9acSAndroid Build Coastguard Worker 	uint32_t count;
281*1c60b9acSAndroid Build Coastguard Worker 	uint32_t preamble;
282*1c60b9acSAndroid Build Coastguard Worker 	uint32_t length;
283*1c60b9acSAndroid Build Coastguard Worker 	uint32_t sid;
284*1c60b9acSAndroid Build Coastguard Worker 	uint32_t inside;
285*1c60b9acSAndroid Build Coastguard Worker 	uint32_t highest_sid;
286*1c60b9acSAndroid Build Coastguard Worker 	uint32_t highest_sid_opened;
287*1c60b9acSAndroid Build Coastguard Worker 	uint32_t cont_exp_sid;
288*1c60b9acSAndroid Build Coastguard Worker 	uint32_t dep;
289*1c60b9acSAndroid Build Coastguard Worker 	uint32_t goaway_last_sid;
290*1c60b9acSAndroid Build Coastguard Worker 	uint32_t goaway_err;
291*1c60b9acSAndroid Build Coastguard Worker 	uint32_t hpack_hdr_len;
292*1c60b9acSAndroid Build Coastguard Worker 
293*1c60b9acSAndroid Build Coastguard Worker 	uint16_t hpack_pos;
294*1c60b9acSAndroid Build Coastguard Worker 
295*1c60b9acSAndroid Build Coastguard Worker 	uint8_t frame_state;
296*1c60b9acSAndroid Build Coastguard Worker 	uint8_t type;
297*1c60b9acSAndroid Build Coastguard Worker 	uint8_t flags;
298*1c60b9acSAndroid Build Coastguard Worker 	uint8_t padding;
299*1c60b9acSAndroid Build Coastguard Worker 	uint8_t weight_temp;
300*1c60b9acSAndroid Build Coastguard Worker 	uint8_t huff_pad;
301*1c60b9acSAndroid Build Coastguard Worker 	char first_hdr_char;
302*1c60b9acSAndroid Build Coastguard Worker 	uint8_t hpack_m;
303*1c60b9acSAndroid Build Coastguard Worker 	uint8_t ext_count;
304*1c60b9acSAndroid Build Coastguard Worker };
305*1c60b9acSAndroid Build Coastguard Worker 
306*1c60b9acSAndroid Build Coastguard Worker struct _lws_h2_related {
307*1c60b9acSAndroid Build Coastguard Worker 
308*1c60b9acSAndroid Build Coastguard Worker 	struct lws_h2_netconn	*h2n; /* malloc'd for root net conn */
309*1c60b9acSAndroid Build Coastguard Worker 
310*1c60b9acSAndroid Build Coastguard Worker 	char			*pending_status_body;
311*1c60b9acSAndroid Build Coastguard Worker 
312*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			h2_state; /* RFC7540 state of the connection */
313*1c60b9acSAndroid Build Coastguard Worker 
314*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			END_STREAM:1;
315*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			END_HEADERS:1;
316*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			send_END_STREAM:1;
317*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			long_poll:1;
318*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			initialized:1;
319*1c60b9acSAndroid Build Coastguard Worker };
320*1c60b9acSAndroid Build Coastguard Worker 
321*1c60b9acSAndroid Build Coastguard Worker #define HTTP2_IS_TOPLEVEL_WSI(wsi) (!wsi->mux.parent_wsi)
322*1c60b9acSAndroid Build Coastguard Worker 
323*1c60b9acSAndroid Build Coastguard Worker int
324*1c60b9acSAndroid Build Coastguard Worker lws_h2_rst_stream(struct lws *wsi, uint32_t err, const char *reason);
325*1c60b9acSAndroid Build Coastguard Worker struct lws * lws_h2_get_nth_child(struct lws *wsi, int n);
326*1c60b9acSAndroid Build Coastguard Worker void lws_h2_init(struct lws *wsi);
327*1c60b9acSAndroid Build Coastguard Worker int
328*1c60b9acSAndroid Build Coastguard Worker lws_h2_settings(struct lws *nwsi, struct http2_settings *settings,
329*1c60b9acSAndroid Build Coastguard Worker 		unsigned char *buf, int len);
330*1c60b9acSAndroid Build Coastguard Worker int
331*1c60b9acSAndroid Build Coastguard Worker lws_h2_parser(struct lws *wsi, unsigned char *in, lws_filepos_t inlen,
332*1c60b9acSAndroid Build Coastguard Worker 	      lws_filepos_t *inused);
333*1c60b9acSAndroid Build Coastguard Worker int
334*1c60b9acSAndroid Build Coastguard Worker lws_h2_do_pps_send(struct lws *wsi);
335*1c60b9acSAndroid Build Coastguard Worker int
336*1c60b9acSAndroid Build Coastguard Worker lws_h2_frame_write(struct lws *wsi, int type, int flags, unsigned int sid,
337*1c60b9acSAndroid Build Coastguard Worker 		   unsigned int len, unsigned char *buf);
338*1c60b9acSAndroid Build Coastguard Worker struct lws *
339*1c60b9acSAndroid Build Coastguard Worker lws_wsi_mux_from_id(struct lws *wsi, unsigned int sid);
340*1c60b9acSAndroid Build Coastguard Worker int
341*1c60b9acSAndroid Build Coastguard Worker lws_hpack_interpret(struct lws *wsi, unsigned char c);
342*1c60b9acSAndroid Build Coastguard Worker int
343*1c60b9acSAndroid Build Coastguard Worker lws_add_http2_header_by_name(struct lws *wsi,
344*1c60b9acSAndroid Build Coastguard Worker 			     const unsigned char *name,
345*1c60b9acSAndroid Build Coastguard Worker 			     const unsigned char *value, int length,
346*1c60b9acSAndroid Build Coastguard Worker 			     unsigned char **p, unsigned char *end);
347*1c60b9acSAndroid Build Coastguard Worker int
348*1c60b9acSAndroid Build Coastguard Worker lws_add_http2_header_by_token(struct lws *wsi,
349*1c60b9acSAndroid Build Coastguard Worker 			      enum lws_token_indexes token,
350*1c60b9acSAndroid Build Coastguard Worker 			      const unsigned char *value, int length,
351*1c60b9acSAndroid Build Coastguard Worker 			      unsigned char **p, unsigned char *end);
352*1c60b9acSAndroid Build Coastguard Worker int
353*1c60b9acSAndroid Build Coastguard Worker lws_add_http2_header_status(struct lws *wsi,
354*1c60b9acSAndroid Build Coastguard Worker 			    unsigned int code, unsigned char **p,
355*1c60b9acSAndroid Build Coastguard Worker 			    unsigned char *end);
356*1c60b9acSAndroid Build Coastguard Worker void
357*1c60b9acSAndroid Build Coastguard Worker lws_hpack_destroy_dynamic_header(struct lws *wsi);
358*1c60b9acSAndroid Build Coastguard Worker int
359*1c60b9acSAndroid Build Coastguard Worker lws_hpack_dynamic_size(struct lws *wsi, int size);
360*1c60b9acSAndroid Build Coastguard Worker int
361*1c60b9acSAndroid Build Coastguard Worker lws_h2_goaway(struct lws *wsi, uint32_t err, const char *reason);
362*1c60b9acSAndroid Build Coastguard Worker int
363*1c60b9acSAndroid Build Coastguard Worker lws_h2_tx_cr_get(struct lws *wsi);
364*1c60b9acSAndroid Build Coastguard Worker void
365*1c60b9acSAndroid Build Coastguard Worker lws_h2_tx_cr_consume(struct lws *wsi, int consumed);
366*1c60b9acSAndroid Build Coastguard Worker int
367*1c60b9acSAndroid Build Coastguard Worker lws_hdr_extant(struct lws *wsi, enum lws_token_indexes h);
368*1c60b9acSAndroid Build Coastguard Worker void
369*1c60b9acSAndroid Build Coastguard Worker lws_pps_schedule(struct lws *wsi, struct lws_h2_protocol_send *pss);
370*1c60b9acSAndroid Build Coastguard Worker 
371*1c60b9acSAndroid Build Coastguard Worker extern const struct http2_settings lws_h2_defaults;
372*1c60b9acSAndroid Build Coastguard Worker int
373*1c60b9acSAndroid Build Coastguard Worker lws_h2_ws_handshake(struct lws *wsi);
374*1c60b9acSAndroid Build Coastguard Worker int lws_h2_issue_preface(struct lws *wsi);
375*1c60b9acSAndroid Build Coastguard Worker int
376*1c60b9acSAndroid Build Coastguard Worker lws_h2_client_handshake(struct lws *wsi);
377*1c60b9acSAndroid Build Coastguard Worker struct lws *
378*1c60b9acSAndroid Build Coastguard Worker lws_wsi_h2_adopt(struct lws *parent_wsi, struct lws *wsi);
379*1c60b9acSAndroid Build Coastguard Worker int
380*1c60b9acSAndroid Build Coastguard Worker lws_handle_POLLOUT_event_h2(struct lws *wsi);
381*1c60b9acSAndroid Build Coastguard Worker int
382*1c60b9acSAndroid Build Coastguard Worker lws_read_h2(struct lws *wsi, unsigned char *buf, lws_filepos_t len);
383*1c60b9acSAndroid Build Coastguard Worker struct lws_h2_protocol_send *
384*1c60b9acSAndroid Build Coastguard Worker lws_h2_new_pps(enum lws_h2_protocol_send_type type);
385