xref: /aosp_15_r20/external/libwebsockets/lib/secure-streams/private-lib-secure-streams.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) 2019 - 2021 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 /* current SS Serialization protocol version */
26*1c60b9acSAndroid Build Coastguard Worker #define LWS_SSS_CLIENT_PROTOCOL_VERSION 1
27*1c60b9acSAndroid Build Coastguard Worker 
28*1c60b9acSAndroid Build Coastguard Worker /*
29*1c60b9acSAndroid Build Coastguard Worker  * Secure Stream state
30*1c60b9acSAndroid Build Coastguard Worker  */
31*1c60b9acSAndroid Build Coastguard Worker 
32*1c60b9acSAndroid Build Coastguard Worker typedef enum {
33*1c60b9acSAndroid Build Coastguard Worker 	SSSEQ_IDLE,
34*1c60b9acSAndroid Build Coastguard Worker 	SSSEQ_TRY_CONNECT,
35*1c60b9acSAndroid Build Coastguard Worker 	SSSEQ_TRY_CONNECT_NAUTH,
36*1c60b9acSAndroid Build Coastguard Worker 	SSSEQ_TRY_CONNECT_SAUTH,
37*1c60b9acSAndroid Build Coastguard Worker 	SSSEQ_RECONNECT_WAIT,
38*1c60b9acSAndroid Build Coastguard Worker 	SSSEQ_DO_RETRY,
39*1c60b9acSAndroid Build Coastguard Worker 	SSSEQ_CONNECTED,
40*1c60b9acSAndroid Build Coastguard Worker } lws_ss_seq_state_t;
41*1c60b9acSAndroid Build Coastguard Worker 
42*1c60b9acSAndroid Build Coastguard Worker struct conn;
43*1c60b9acSAndroid Build Coastguard Worker 
44*1c60b9acSAndroid Build Coastguard Worker /**
45*1c60b9acSAndroid Build Coastguard Worker  * lws_ss_handle_t: publicly-opaque secure stream object implementation
46*1c60b9acSAndroid Build Coastguard Worker  */
47*1c60b9acSAndroid Build Coastguard Worker 
48*1c60b9acSAndroid Build Coastguard Worker typedef struct lws_ss_handle {
49*1c60b9acSAndroid Build Coastguard Worker 	lws_ss_info_t		info;	  /**< copy of stream creation info */
50*1c60b9acSAndroid Build Coastguard Worker 
51*1c60b9acSAndroid Build Coastguard Worker 	lws_lifecycle_t		lc;
52*1c60b9acSAndroid Build Coastguard Worker 
53*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SYS_METRICS)
54*1c60b9acSAndroid Build Coastguard Worker 	lws_metrics_caliper_compose(cal_txn)
55*1c60b9acSAndroid Build Coastguard Worker #endif
56*1c60b9acSAndroid Build Coastguard Worker 
57*1c60b9acSAndroid Build Coastguard Worker 	struct lws_dll2		list;	  /**< pt lists active ss */
58*1c60b9acSAndroid Build Coastguard Worker 	struct lws_dll2		to_list;  /**< pt lists ss with pending to-s */
59*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SERVER)
60*1c60b9acSAndroid Build Coastguard Worker 	struct lws_dll2		cli_list;  /**< same server clients list */
61*1c60b9acSAndroid Build Coastguard Worker #endif
62*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SYS_FAULT_INJECTION)
63*1c60b9acSAndroid Build Coastguard Worker 	lws_fi_ctx_t		fic;	/**< Fault Injection context */
64*1c60b9acSAndroid Build Coastguard Worker #endif
65*1c60b9acSAndroid Build Coastguard Worker 
66*1c60b9acSAndroid Build Coastguard Worker 	struct lws_dll2_owner	src_list; /**< sink's list of bound sources */
67*1c60b9acSAndroid Build Coastguard Worker 
68*1c60b9acSAndroid Build Coastguard Worker 	struct lws_context      *context; /**< lws context we are created on */
69*1c60b9acSAndroid Build Coastguard Worker 	const lws_ss_policy_t	*policy;  /**< system policy for stream */
70*1c60b9acSAndroid Build Coastguard Worker 
71*1c60b9acSAndroid Build Coastguard Worker 	struct lws_sequencer	*seq;	  /**< owning sequencer if any */
72*1c60b9acSAndroid Build Coastguard Worker 	struct lws		*wsi;	  /**< the stream wsi if any */
73*1c60b9acSAndroid Build Coastguard Worker 
74*1c60b9acSAndroid Build Coastguard Worker 	struct conn		*conn_if_sspc_onw;
75*1c60b9acSAndroid Build Coastguard Worker 
76*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SSPLUGINS)
77*1c60b9acSAndroid Build Coastguard Worker 	void			*nauthi;  /**< the nauth plugin instance data */
78*1c60b9acSAndroid Build Coastguard Worker 	void			*sauthi;  /**< the sauth plugin instance data */
79*1c60b9acSAndroid Build Coastguard Worker #endif
80*1c60b9acSAndroid Build Coastguard Worker 
81*1c60b9acSAndroid Build Coastguard Worker 	lws_ss_metadata_t	*metadata;
82*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SS_DIRECT_PROTOCOL_STR)
83*1c60b9acSAndroid Build Coastguard Worker 	lws_ss_metadata_t	*instant_metadata; /**< for set instant metadata */
84*1c60b9acSAndroid Build Coastguard Worker 	struct lwsac            *imd_ac;           /**< for get custom header */
85*1c60b9acSAndroid Build Coastguard Worker #endif
86*1c60b9acSAndroid Build Coastguard Worker 	const lws_ss_policy_t	*rideshare;
87*1c60b9acSAndroid Build Coastguard Worker 	struct lws_ss_handle	*h_in_svc;
88*1c60b9acSAndroid Build Coastguard Worker 
89*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_CONMON)
90*1c60b9acSAndroid Build Coastguard Worker 	char			*conmon_json;
91*1c60b9acSAndroid Build Coastguard Worker #endif
92*1c60b9acSAndroid Build Coastguard Worker 
93*1c60b9acSAndroid Build Coastguard Worker 	//struct lws_ss_handle	*h_sink;  /**< sink we are bound to, or NULL */
94*1c60b9acSAndroid Build Coastguard Worker 	//void 			*sink_obj;/**< sink's private object representing us */
95*1c60b9acSAndroid Build Coastguard Worker 
96*1c60b9acSAndroid Build Coastguard Worker 	lws_sorted_usec_list_t	sul_timeout;
97*1c60b9acSAndroid Build Coastguard Worker 	lws_sorted_usec_list_t	sul;
98*1c60b9acSAndroid Build Coastguard Worker 	lws_ss_tx_ordinal_t	txord;
99*1c60b9acSAndroid Build Coastguard Worker 
100*1c60b9acSAndroid Build Coastguard Worker 	/* protocol-specific connection helpers */
101*1c60b9acSAndroid Build Coastguard Worker 
102*1c60b9acSAndroid Build Coastguard Worker 	union {
103*1c60b9acSAndroid Build Coastguard Worker 
104*1c60b9acSAndroid Build Coastguard Worker 		/* ...for http-related protocols... */
105*1c60b9acSAndroid Build Coastguard Worker 
106*1c60b9acSAndroid Build Coastguard Worker 		struct {
107*1c60b9acSAndroid Build Coastguard Worker 
108*1c60b9acSAndroid Build Coastguard Worker 			/* common to all http-related protocols */
109*1c60b9acSAndroid Build Coastguard Worker 
110*1c60b9acSAndroid Build Coastguard Worker 			/* incoming multipart parsing */
111*1c60b9acSAndroid Build Coastguard Worker 
112*1c60b9acSAndroid Build Coastguard Worker 			char boundary[24];	/* --boundary from headers */
113*1c60b9acSAndroid Build Coastguard Worker 			uint8_t boundary_len;	/* length of --boundary */
114*1c60b9acSAndroid Build Coastguard Worker 			uint8_t boundary_seq;	/* current match amount */
115*1c60b9acSAndroid Build Coastguard Worker 			uint8_t boundary_dashes; /* check for -- after */
116*1c60b9acSAndroid Build Coastguard Worker 			uint8_t boundary_post; /* swallow post CRLF */
117*1c60b9acSAndroid Build Coastguard Worker 
118*1c60b9acSAndroid Build Coastguard Worker 			uint8_t som:1;	/* SOM has been sent */
119*1c60b9acSAndroid Build Coastguard Worker 			uint8_t eom:1;  /* EOM has been sent */
120*1c60b9acSAndroid Build Coastguard Worker 			uint8_t any:1;	/* any content has been sent */
121*1c60b9acSAndroid Build Coastguard Worker 
122*1c60b9acSAndroid Build Coastguard Worker 
123*1c60b9acSAndroid Build Coastguard Worker 			uint8_t good_respcode:1; /* 200 type response code */
124*1c60b9acSAndroid Build Coastguard Worker 
125*1c60b9acSAndroid Build Coastguard Worker 			union {
126*1c60b9acSAndroid Build Coastguard Worker 				struct { /* LWSSSP_H1 */
127*1c60b9acSAndroid Build Coastguard Worker #if defined(WIN32)
128*1c60b9acSAndroid Build Coastguard Worker 					uint8_t dummy;
129*1c60b9acSAndroid Build Coastguard Worker #endif
130*1c60b9acSAndroid Build Coastguard Worker 				} h1;
131*1c60b9acSAndroid Build Coastguard Worker 				struct { /* LWSSSP_H2 */
132*1c60b9acSAndroid Build Coastguard Worker #if defined(WIN32)
133*1c60b9acSAndroid Build Coastguard Worker 					uint8_t dummy;
134*1c60b9acSAndroid Build Coastguard Worker #endif
135*1c60b9acSAndroid Build Coastguard Worker 				} h2;
136*1c60b9acSAndroid Build Coastguard Worker 				struct { /* LWSSSP_WS */
137*1c60b9acSAndroid Build Coastguard Worker #if defined(WIN32)
138*1c60b9acSAndroid Build Coastguard Worker 					uint8_t dummy;
139*1c60b9acSAndroid Build Coastguard Worker #endif
140*1c60b9acSAndroid Build Coastguard Worker 				} ws;
141*1c60b9acSAndroid Build Coastguard Worker 			} u;
142*1c60b9acSAndroid Build Coastguard Worker 		} http;
143*1c60b9acSAndroid Build Coastguard Worker 
144*1c60b9acSAndroid Build Coastguard Worker 		/* details for non-http related protocols... */
145*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_ROLE_MQTT)
146*1c60b9acSAndroid Build Coastguard Worker 		struct {
147*1c60b9acSAndroid Build Coastguard Worker 			lws_mqtt_topic_elem_t		topic_qos;
148*1c60b9acSAndroid Build Coastguard Worker 			lws_mqtt_topic_elem_t		sub_top;
149*1c60b9acSAndroid Build Coastguard Worker 			lws_mqtt_subscribe_param_t 	sub_info;
150*1c60b9acSAndroid Build Coastguard Worker 			/* allocation that must be destroyed with conn */
151*1c60b9acSAndroid Build Coastguard Worker 			void				*heap_baggage;
152*1c60b9acSAndroid Build Coastguard Worker 			const char			*subscribe_to;
153*1c60b9acSAndroid Build Coastguard Worker 			size_t				subscribe_to_len;
154*1c60b9acSAndroid Build Coastguard Worker 		} mqtt;
155*1c60b9acSAndroid Build Coastguard Worker #endif
156*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SYS_SMD)
157*1c60b9acSAndroid Build Coastguard Worker 		struct {
158*1c60b9acSAndroid Build Coastguard Worker 			struct lws_smd_peer		*smd_peer;
159*1c60b9acSAndroid Build Coastguard Worker 			lws_sorted_usec_list_t		sul_write;
160*1c60b9acSAndroid Build Coastguard Worker 		} smd;
161*1c60b9acSAndroid Build Coastguard Worker #endif
162*1c60b9acSAndroid Build Coastguard Worker 	} u;
163*1c60b9acSAndroid Build Coastguard Worker 
164*1c60b9acSAndroid Build Coastguard Worker 	unsigned long		writeable_len;
165*1c60b9acSAndroid Build Coastguard Worker 
166*1c60b9acSAndroid Build Coastguard Worker 	lws_ss_constate_t	connstate;/**< public connection state */
167*1c60b9acSAndroid Build Coastguard Worker 	lws_ss_seq_state_t	seqstate; /**< private connection state */
168*1c60b9acSAndroid Build Coastguard Worker 	lws_ss_state_return_t	pending_ret; /**< holds desired disposition
169*1c60b9acSAndroid Build Coastguard Worker 						* for ss during CCE */
170*1c60b9acSAndroid Build Coastguard Worker 
171*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SERVER)
172*1c60b9acSAndroid Build Coastguard Worker 	int			txn_resp;
173*1c60b9acSAndroid Build Coastguard Worker #endif
174*1c60b9acSAndroid Build Coastguard Worker 
175*1c60b9acSAndroid Build Coastguard Worker 	uint16_t		retry;	  /**< retry / backoff tracking */
176*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_CONMON)
177*1c60b9acSAndroid Build Coastguard Worker 	uint16_t		conmon_len;
178*1c60b9acSAndroid Build Coastguard Worker #endif
179*1c60b9acSAndroid Build Coastguard Worker 	int16_t			temp16;
180*1c60b9acSAndroid Build Coastguard Worker 
181*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			tsi;	  /**< service thread idx, usually 0 */
182*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			subseq;	  /**< emulate SOM tracking */
183*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			txn_ok;	  /**< 1 = transaction was OK */
184*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			prev_ss_state;
185*1c60b9acSAndroid Build Coastguard Worker 
186*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			txn_resp_set:1; /**< user code set one */
187*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			txn_resp_pending:1; /**< we have yet to send */
188*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			hanging_som:1;
189*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			inside_msg:1;
190*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			being_serialized:1; /* we are not the consumer */
191*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			destroying:1;
192*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			ss_dangling_connected:1;
193*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			proxy_onward:1; /* opaque is conn */
194*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			inside_connect:1; /* set if we are currently
195*1c60b9acSAndroid Build Coastguard Worker 						   * creating the onward
196*1c60b9acSAndroid Build Coastguard Worker 						   * connect */
197*1c60b9acSAndroid Build Coastguard Worker } lws_ss_handle_t;
198*1c60b9acSAndroid Build Coastguard Worker 
199*1c60b9acSAndroid Build Coastguard Worker /* connection helper that doesn't need to hang around after connection starts */
200*1c60b9acSAndroid Build Coastguard Worker 
201*1c60b9acSAndroid Build Coastguard Worker union lws_ss_contemp {
202*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_ROLE_MQTT)
203*1c60b9acSAndroid Build Coastguard Worker 	lws_mqtt_client_connect_param_t ccp;
204*1c60b9acSAndroid Build Coastguard Worker #else
205*1c60b9acSAndroid Build Coastguard Worker #if defined(WIN32)
206*1c60b9acSAndroid Build Coastguard Worker 	uint8_t	dummy;
207*1c60b9acSAndroid Build Coastguard Worker #endif
208*1c60b9acSAndroid Build Coastguard Worker #endif
209*1c60b9acSAndroid Build Coastguard Worker };
210*1c60b9acSAndroid Build Coastguard Worker 
211*1c60b9acSAndroid Build Coastguard Worker /*
212*1c60b9acSAndroid Build Coastguard Worker  * When allocating the opaque handle, we overallocate for:
213*1c60b9acSAndroid Build Coastguard Worker  *
214*1c60b9acSAndroid Build Coastguard Worker  *  1) policy->nauth_plugin->alloc (.nauthi) if any
215*1c60b9acSAndroid Build Coastguard Worker  *  2) policy->sauth_plugin->alloc (.sauthi) if any
216*1c60b9acSAndroid Build Coastguard Worker  *  3) copy of creation info stream type pointed to by info.streamtype... this
217*1c60b9acSAndroid Build Coastguard Worker  *     may be arbitrarily long and since it may be coming from socket ipc and be
218*1c60b9acSAndroid Build Coastguard Worker  *     temporary at creation time, we need a place for the copy to stay in scope
219*1c60b9acSAndroid Build Coastguard Worker  *  4) copy of info->streamtype contents
220*1c60b9acSAndroid Build Coastguard Worker  */
221*1c60b9acSAndroid Build Coastguard Worker 
222*1c60b9acSAndroid Build Coastguard Worker 
223*1c60b9acSAndroid Build Coastguard Worker /* the user object allocation is immediately after the ss object allocation */
224*1c60b9acSAndroid Build Coastguard Worker #define ss_to_userobj(ss) ((void *)&(ss)[1])
225*1c60b9acSAndroid Build Coastguard Worker 
226*1c60b9acSAndroid Build Coastguard Worker /*
227*1c60b9acSAndroid Build Coastguard Worker  * serialization parser state
228*1c60b9acSAndroid Build Coastguard Worker  */
229*1c60b9acSAndroid Build Coastguard Worker 
230*1c60b9acSAndroid Build Coastguard Worker enum {
231*1c60b9acSAndroid Build Coastguard Worker 	KIND_C_TO_P,
232*1c60b9acSAndroid Build Coastguard Worker 	KIND_SS_TO_P,
233*1c60b9acSAndroid Build Coastguard Worker };
234*1c60b9acSAndroid Build Coastguard Worker 
235*1c60b9acSAndroid Build Coastguard Worker struct lws_ss_serialization_parser {
236*1c60b9acSAndroid Build Coastguard Worker 	char			streamtype[32];
237*1c60b9acSAndroid Build Coastguard Worker 	char			rideshare[32];
238*1c60b9acSAndroid Build Coastguard Worker 	char			metadata_name[32];
239*1c60b9acSAndroid Build Coastguard Worker 
240*1c60b9acSAndroid Build Coastguard Worker 	uint64_t		ust_pwait;
241*1c60b9acSAndroid Build Coastguard Worker 
242*1c60b9acSAndroid Build Coastguard Worker 	lws_ss_metadata_t	*ssmd;
243*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			*rxmetaval;
244*1c60b9acSAndroid Build Coastguard Worker 
245*1c60b9acSAndroid Build Coastguard Worker 	int			ps;
246*1c60b9acSAndroid Build Coastguard Worker 	int			ctr;
247*1c60b9acSAndroid Build Coastguard Worker 
248*1c60b9acSAndroid Build Coastguard Worker 	uint32_t		usd_phandling;
249*1c60b9acSAndroid Build Coastguard Worker 	uint32_t		flags;
250*1c60b9acSAndroid Build Coastguard Worker 	uint32_t		client_pid;
251*1c60b9acSAndroid Build Coastguard Worker 	int32_t			temp32;
252*1c60b9acSAndroid Build Coastguard Worker 
253*1c60b9acSAndroid Build Coastguard Worker 	int32_t			txcr_out;
254*1c60b9acSAndroid Build Coastguard Worker 	int32_t			txcr_in;
255*1c60b9acSAndroid Build Coastguard Worker 	uint16_t		rem;
256*1c60b9acSAndroid Build Coastguard Worker 
257*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			type;
258*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			frag1;
259*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			slen;
260*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			rsl_pos;
261*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			rsl_idx;
262*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			protocol_version;
263*1c60b9acSAndroid Build Coastguard Worker };
264*1c60b9acSAndroid Build Coastguard Worker 
265*1c60b9acSAndroid Build Coastguard Worker /*
266*1c60b9acSAndroid Build Coastguard Worker  * Unlike locally-fulfilled SS, SSS doesn't have to hold metadata on client side
267*1c60b9acSAndroid Build Coastguard Worker  * but pass it through to the proxy.  The client side doesn't know the real
268*1c60b9acSAndroid Build Coastguard Worker  * metadata names that are available in the policy (since it's hardcoded in code
269*1c60b9acSAndroid Build Coastguard Worker  * no point passing them back to the client from the policy).  Because of that,
270*1c60b9acSAndroid Build Coastguard Worker  * it doesn't know how many to allocate when we create the sspc_handle either.
271*1c60b9acSAndroid Build Coastguard Worker  *
272*1c60b9acSAndroid Build Coastguard Worker  * So we use a linked-list of changed-but-not-yet-proxied metadata allocated
273*1c60b9acSAndroid Build Coastguard Worker  * on the heap and items removed as they are proxied out.  Anything on the list
274*1c60b9acSAndroid Build Coastguard Worker  * is sent to the proxy before any requested tx is handled.
275*1c60b9acSAndroid Build Coastguard Worker  *
276*1c60b9acSAndroid Build Coastguard Worker  * This is also used to queue tx credit changes
277*1c60b9acSAndroid Build Coastguard Worker  */
278*1c60b9acSAndroid Build Coastguard Worker 
279*1c60b9acSAndroid Build Coastguard Worker typedef struct lws_sspc_metadata {
280*1c60b9acSAndroid Build Coastguard Worker 	lws_dll2_t	list;
281*1c60b9acSAndroid Build Coastguard Worker 	char		name[32];  /* empty string, then actually TCXR */
282*1c60b9acSAndroid Build Coastguard Worker 	size_t		len;
283*1c60b9acSAndroid Build Coastguard Worker 	int		tx_cr_adjust;
284*1c60b9acSAndroid Build Coastguard Worker 
285*1c60b9acSAndroid Build Coastguard Worker 	/* the value of length .len is overallocated after this */
286*1c60b9acSAndroid Build Coastguard Worker } lws_sspc_metadata_t;
287*1c60b9acSAndroid Build Coastguard Worker 
288*1c60b9acSAndroid Build Coastguard Worker /* state of the upstream proxy onward connection */
289*1c60b9acSAndroid Build Coastguard Worker 
290*1c60b9acSAndroid Build Coastguard Worker enum {
291*1c60b9acSAndroid Build Coastguard Worker 	LWSSSPC_ONW_NONE,
292*1c60b9acSAndroid Build Coastguard Worker 	LWSSSPC_ONW_REQ,
293*1c60b9acSAndroid Build Coastguard Worker 	LWSSSPC_ONW_ONGOING,
294*1c60b9acSAndroid Build Coastguard Worker 	LWSSSPC_ONW_CONN,
295*1c60b9acSAndroid Build Coastguard Worker };
296*1c60b9acSAndroid Build Coastguard Worker 
297*1c60b9acSAndroid Build Coastguard Worker typedef struct lws_sspc_handle {
298*1c60b9acSAndroid Build Coastguard Worker 	char			rideshare_list[128];
299*1c60b9acSAndroid Build Coastguard Worker 
300*1c60b9acSAndroid Build Coastguard Worker 	lws_lifecycle_t		lc;
301*1c60b9acSAndroid Build Coastguard Worker 
302*1c60b9acSAndroid Build Coastguard Worker 	lws_ss_info_t		ssi;
303*1c60b9acSAndroid Build Coastguard Worker 	lws_sorted_usec_list_t	sul_retry;
304*1c60b9acSAndroid Build Coastguard Worker 
305*1c60b9acSAndroid Build Coastguard Worker 	struct lws_ss_serialization_parser parser;
306*1c60b9acSAndroid Build Coastguard Worker 
307*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SYS_FAULT_INJECTION)
308*1c60b9acSAndroid Build Coastguard Worker 	lws_fi_ctx_t		fic;	/**< Fault Injection context */
309*1c60b9acSAndroid Build Coastguard Worker #endif
310*1c60b9acSAndroid Build Coastguard Worker 
311*1c60b9acSAndroid Build Coastguard Worker 	lws_dll2_owner_t	metadata_owner;
312*1c60b9acSAndroid Build Coastguard Worker 	lws_dll2_owner_t	metadata_owner_rx;
313*1c60b9acSAndroid Build Coastguard Worker 
314*1c60b9acSAndroid Build Coastguard Worker 	struct lws_dll2		client_list;
315*1c60b9acSAndroid Build Coastguard Worker 	struct lws_tx_credit	txc;
316*1c60b9acSAndroid Build Coastguard Worker 
317*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SYS_METRICS)
318*1c60b9acSAndroid Build Coastguard Worker 	lws_metrics_caliper_compose(cal_txn)
319*1c60b9acSAndroid Build Coastguard Worker #endif
320*1c60b9acSAndroid Build Coastguard Worker 
321*1c60b9acSAndroid Build Coastguard Worker 	struct lws		*cwsi;
322*1c60b9acSAndroid Build Coastguard Worker 
323*1c60b9acSAndroid Build Coastguard Worker 	struct lws_dsh		*dsh;
324*1c60b9acSAndroid Build Coastguard Worker 	struct lws_context	*context;
325*1c60b9acSAndroid Build Coastguard Worker 
326*1c60b9acSAndroid Build Coastguard Worker 	struct lws_sspc_handle	*h_in_svc;
327*1c60b9acSAndroid Build Coastguard Worker 	/*
328*1c60b9acSAndroid Build Coastguard Worker 	 * Used to detect illegal lws_sspc_destroy() calls while still
329*1c60b9acSAndroid Build Coastguard Worker 	 * being serviced
330*1c60b9acSAndroid Build Coastguard Worker 	 */
331*1c60b9acSAndroid Build Coastguard Worker 
332*1c60b9acSAndroid Build Coastguard Worker 	lws_usec_t		us_earliest_write_req;
333*1c60b9acSAndroid Build Coastguard Worker 	lws_usec_t		us_start_upstream;
334*1c60b9acSAndroid Build Coastguard Worker 
335*1c60b9acSAndroid Build Coastguard Worker 	unsigned long		writeable_len;
336*1c60b9acSAndroid Build Coastguard Worker 
337*1c60b9acSAndroid Build Coastguard Worker 	lws_ss_conn_states_t	state;
338*1c60b9acSAndroid Build Coastguard Worker 
339*1c60b9acSAndroid Build Coastguard Worker 	uint32_t		timeout_ms;
340*1c60b9acSAndroid Build Coastguard Worker 	uint32_t		ord;
341*1c60b9acSAndroid Build Coastguard Worker 
342*1c60b9acSAndroid Build Coastguard Worker 	int16_t			temp16;
343*1c60b9acSAndroid Build Coastguard Worker 
344*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			rideshare_ofs[4];
345*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			rsidx;
346*1c60b9acSAndroid Build Coastguard Worker 
347*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			prev_ss_state;
348*1c60b9acSAndroid Build Coastguard Worker 
349*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			conn_req_state:2;
350*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			destroying:1;
351*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			non_wsi:1;
352*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			ignore_txc:1;
353*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			pending_timeout_update:1;
354*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			pending_writeable_len:1;
355*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			creating_cb_done:1;
356*1c60b9acSAndroid Build Coastguard Worker 	uint8_t			ss_dangling_connected:1;
357*1c60b9acSAndroid Build Coastguard Worker } lws_sspc_handle_t;
358*1c60b9acSAndroid Build Coastguard Worker 
359*1c60b9acSAndroid Build Coastguard Worker typedef struct backoffs {
360*1c60b9acSAndroid Build Coastguard Worker 	struct backoffs *next;
361*1c60b9acSAndroid Build Coastguard Worker 	const char *name;
362*1c60b9acSAndroid Build Coastguard Worker 	lws_retry_bo_t r;
363*1c60b9acSAndroid Build Coastguard Worker } backoff_t;
364*1c60b9acSAndroid Build Coastguard Worker 
365*1c60b9acSAndroid Build Coastguard Worker union u {
366*1c60b9acSAndroid Build Coastguard Worker 	backoff_t		*b;
367*1c60b9acSAndroid Build Coastguard Worker 	lws_ss_x509_t		*x;
368*1c60b9acSAndroid Build Coastguard Worker 	lws_ss_trust_store_t	*t;
369*1c60b9acSAndroid Build Coastguard Worker 	lws_ss_policy_t		*p;
370*1c60b9acSAndroid Build Coastguard Worker 	lws_ss_auth_t		*a;
371*1c60b9acSAndroid Build Coastguard Worker 	lws_metric_policy_t	*m;
372*1c60b9acSAndroid Build Coastguard Worker };
373*1c60b9acSAndroid Build Coastguard Worker 
374*1c60b9acSAndroid Build Coastguard Worker enum {
375*1c60b9acSAndroid Build Coastguard Worker 	LTY_BACKOFF,
376*1c60b9acSAndroid Build Coastguard Worker 	LTY_X509,
377*1c60b9acSAndroid Build Coastguard Worker 	LTY_TRUSTSTORE,
378*1c60b9acSAndroid Build Coastguard Worker 	LTY_POLICY,
379*1c60b9acSAndroid Build Coastguard Worker 	LTY_AUTH,
380*1c60b9acSAndroid Build Coastguard Worker 	LTY_METRICS,
381*1c60b9acSAndroid Build Coastguard Worker 
382*1c60b9acSAndroid Build Coastguard Worker 	_LTY_COUNT /* always last */
383*1c60b9acSAndroid Build Coastguard Worker };
384*1c60b9acSAndroid Build Coastguard Worker 
385*1c60b9acSAndroid Build Coastguard Worker 
386*1c60b9acSAndroid Build Coastguard Worker struct policy_cb_args {
387*1c60b9acSAndroid Build Coastguard Worker 	struct lejp_ctx jctx;
388*1c60b9acSAndroid Build Coastguard Worker 	struct lws_context *context;
389*1c60b9acSAndroid Build Coastguard Worker 	struct lwsac *ac;
390*1c60b9acSAndroid Build Coastguard Worker 
391*1c60b9acSAndroid Build Coastguard Worker 	const char *socks5_proxy;
392*1c60b9acSAndroid Build Coastguard Worker 
393*1c60b9acSAndroid Build Coastguard Worker 	struct lws_b64state b64;
394*1c60b9acSAndroid Build Coastguard Worker 
395*1c60b9acSAndroid Build Coastguard Worker 	lws_ss_http_respmap_t respmap[16];
396*1c60b9acSAndroid Build Coastguard Worker 
397*1c60b9acSAndroid Build Coastguard Worker 	union u heads[_LTY_COUNT];
398*1c60b9acSAndroid Build Coastguard Worker 	union u curr[_LTY_COUNT];
399*1c60b9acSAndroid Build Coastguard Worker 
400*1c60b9acSAndroid Build Coastguard Worker 	uint8_t *p;
401*1c60b9acSAndroid Build Coastguard Worker 
402*1c60b9acSAndroid Build Coastguard Worker 	int count;
403*1c60b9acSAndroid Build Coastguard Worker 	char pending_respmap;
404*1c60b9acSAndroid Build Coastguard Worker 
405*1c60b9acSAndroid Build Coastguard Worker 	uint8_t parse_data:1;
406*1c60b9acSAndroid Build Coastguard Worker };
407*1c60b9acSAndroid Build Coastguard Worker 
408*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SYS_SMD)
409*1c60b9acSAndroid Build Coastguard Worker extern const lws_ss_policy_t pol_smd;
410*1c60b9acSAndroid Build Coastguard Worker #endif
411*1c60b9acSAndroid Build Coastguard Worker 
412*1c60b9acSAndroid Build Coastguard Worker 
413*1c60b9acSAndroid Build Coastguard Worker /*
414*1c60b9acSAndroid Build Coastguard Worker  * returns one of
415*1c60b9acSAndroid Build Coastguard Worker  *
416*1c60b9acSAndroid Build Coastguard Worker  * 	LWSSSSRET_OK
417*1c60b9acSAndroid Build Coastguard Worker  *	LWSSSSRET_DISCONNECT_ME
418*1c60b9acSAndroid Build Coastguard Worker  *	LWSSSSRET_DESTROY_ME
419*1c60b9acSAndroid Build Coastguard Worker  */
420*1c60b9acSAndroid Build Coastguard Worker int
421*1c60b9acSAndroid Build Coastguard Worker lws_ss_deserialize_parse(struct lws_ss_serialization_parser *par,
422*1c60b9acSAndroid Build Coastguard Worker 			 struct lws_context *context,
423*1c60b9acSAndroid Build Coastguard Worker 			 struct lws_dsh *dsh, const uint8_t *cp, size_t len,
424*1c60b9acSAndroid Build Coastguard Worker 			 lws_ss_conn_states_t *state, void *parconn,
425*1c60b9acSAndroid Build Coastguard Worker 			 lws_ss_handle_t **pss, lws_ss_info_t *ssi, char client);
426*1c60b9acSAndroid Build Coastguard Worker int
427*1c60b9acSAndroid Build Coastguard Worker lws_ss_serialize_rx_payload(struct lws_dsh *dsh, const uint8_t *buf,
428*1c60b9acSAndroid Build Coastguard Worker 			    size_t len, int flags, const char *rsp);
429*1c60b9acSAndroid Build Coastguard Worker int
430*1c60b9acSAndroid Build Coastguard Worker lws_ss_deserialize_tx_payload(struct lws_dsh *dsh, struct lws *wsi,
431*1c60b9acSAndroid Build Coastguard Worker 			      lws_ss_tx_ordinal_t ord, uint8_t *buf,
432*1c60b9acSAndroid Build Coastguard Worker 			      size_t *len, int *flags);
433*1c60b9acSAndroid Build Coastguard Worker int
434*1c60b9acSAndroid Build Coastguard Worker lws_ss_serialize_state(struct lws *wsi, struct lws_dsh *dsh, lws_ss_constate_t state,
435*1c60b9acSAndroid Build Coastguard Worker 		       lws_ss_tx_ordinal_t ack);
436*1c60b9acSAndroid Build Coastguard Worker 
437*1c60b9acSAndroid Build Coastguard Worker const lws_ss_policy_t *
438*1c60b9acSAndroid Build Coastguard Worker lws_ss_policy_lookup(const struct lws_context *context, const char *streamtype);
439*1c60b9acSAndroid Build Coastguard Worker 
440*1c60b9acSAndroid Build Coastguard Worker /* can be used as a cb from lws_dll2_foreach_safe() to destroy ss */
441*1c60b9acSAndroid Build Coastguard Worker int
442*1c60b9acSAndroid Build Coastguard Worker lws_ss_destroy_dll(struct lws_dll2 *d, void *user);
443*1c60b9acSAndroid Build Coastguard Worker 
444*1c60b9acSAndroid Build Coastguard Worker int
445*1c60b9acSAndroid Build Coastguard Worker lws_sspc_destroy_dll(struct lws_dll2 *d, void *user);
446*1c60b9acSAndroid Build Coastguard Worker 
447*1c60b9acSAndroid Build Coastguard Worker void
448*1c60b9acSAndroid Build Coastguard Worker lws_sspc_rxmetadata_destroy(lws_sspc_handle_t *h);
449*1c60b9acSAndroid Build Coastguard Worker 
450*1c60b9acSAndroid Build Coastguard Worker int
451*1c60b9acSAndroid Build Coastguard Worker lws_ss_policy_set(struct lws_context *context, const char *name);
452*1c60b9acSAndroid Build Coastguard Worker 
453*1c60b9acSAndroid Build Coastguard Worker int
454*1c60b9acSAndroid Build Coastguard Worker lws_ss_sys_fetch_policy(struct lws_context *context);
455*1c60b9acSAndroid Build Coastguard Worker 
456*1c60b9acSAndroid Build Coastguard Worker lws_ss_state_return_t
457*1c60b9acSAndroid Build Coastguard Worker lws_ss_event_helper(lws_ss_handle_t *h, lws_ss_constate_t cs);
458*1c60b9acSAndroid Build Coastguard Worker 
459*1c60b9acSAndroid Build Coastguard Worker lws_ss_state_return_t
460*1c60b9acSAndroid Build Coastguard Worker _lws_ss_backoff(lws_ss_handle_t *h, lws_usec_t us_override);
461*1c60b9acSAndroid Build Coastguard Worker 
462*1c60b9acSAndroid Build Coastguard Worker lws_ss_state_return_t
463*1c60b9acSAndroid Build Coastguard Worker lws_ss_backoff(lws_ss_handle_t *h);
464*1c60b9acSAndroid Build Coastguard Worker 
465*1c60b9acSAndroid Build Coastguard Worker int
466*1c60b9acSAndroid Build Coastguard Worker _lws_ss_handle_state_ret_CAN_DESTROY_HANDLE(lws_ss_state_return_t r, struct lws *wsi,
467*1c60b9acSAndroid Build Coastguard Worker 			 lws_ss_handle_t **ph);
468*1c60b9acSAndroid Build Coastguard Worker 
469*1c60b9acSAndroid Build Coastguard Worker int
470*1c60b9acSAndroid Build Coastguard Worker lws_ss_set_timeout_us(lws_ss_handle_t *h, lws_usec_t us);
471*1c60b9acSAndroid Build Coastguard Worker 
472*1c60b9acSAndroid Build Coastguard Worker void
473*1c60b9acSAndroid Build Coastguard Worker ss_proxy_onward_txcr(void *userobj, int bump);
474*1c60b9acSAndroid Build Coastguard Worker 
475*1c60b9acSAndroid Build Coastguard Worker int
476*1c60b9acSAndroid Build Coastguard Worker lws_ss_serialize_txcr(struct lws_dsh *dsh, int txcr);
477*1c60b9acSAndroid Build Coastguard Worker 
478*1c60b9acSAndroid Build Coastguard Worker int
479*1c60b9acSAndroid Build Coastguard Worker lws_ss_sys_auth_api_amazon_com(struct lws_context *context);
480*1c60b9acSAndroid Build Coastguard Worker 
481*1c60b9acSAndroid Build Coastguard Worker lws_ss_metadata_t *
482*1c60b9acSAndroid Build Coastguard Worker lws_ss_get_handle_metadata(struct lws_ss_handle *h, const char *name);
483*1c60b9acSAndroid Build Coastguard Worker lws_ss_metadata_t *
484*1c60b9acSAndroid Build Coastguard Worker lws_ss_policy_metadata_index(const lws_ss_policy_t *p, size_t index);
485*1c60b9acSAndroid Build Coastguard Worker 
486*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SS_DIRECT_PROTOCOL_STR)
487*1c60b9acSAndroid Build Coastguard Worker lws_ss_metadata_t *
488*1c60b9acSAndroid Build Coastguard Worker lws_ss_get_handle_instant_metadata(struct lws_ss_handle *h, const char *name);
489*1c60b9acSAndroid Build Coastguard Worker #endif
490*1c60b9acSAndroid Build Coastguard Worker 
491*1c60b9acSAndroid Build Coastguard Worker lws_ss_metadata_t *
492*1c60b9acSAndroid Build Coastguard Worker lws_ss_policy_metadata(const lws_ss_policy_t *p, const char *name);
493*1c60b9acSAndroid Build Coastguard Worker 
494*1c60b9acSAndroid Build Coastguard Worker int
495*1c60b9acSAndroid Build Coastguard Worker lws_ss_exp_cb_metadata(void *priv, const char *name, char *out, size_t *pos,
496*1c60b9acSAndroid Build Coastguard Worker 			size_t olen, size_t *exp_ofs);
497*1c60b9acSAndroid Build Coastguard Worker 
498*1c60b9acSAndroid Build Coastguard Worker int
499*1c60b9acSAndroid Build Coastguard Worker _lws_ss_set_metadata(lws_ss_metadata_t *omd, const char *name,
500*1c60b9acSAndroid Build Coastguard Worker 		     const void *value, size_t len);
501*1c60b9acSAndroid Build Coastguard Worker 
502*1c60b9acSAndroid Build Coastguard Worker int
503*1c60b9acSAndroid Build Coastguard Worker _lws_ss_alloc_set_metadata(lws_ss_metadata_t *omd, const char *name,
504*1c60b9acSAndroid Build Coastguard Worker 			   const void *value, size_t len);
505*1c60b9acSAndroid Build Coastguard Worker 
506*1c60b9acSAndroid Build Coastguard Worker lws_ss_state_return_t
507*1c60b9acSAndroid Build Coastguard Worker _lws_ss_client_connect(lws_ss_handle_t *h, int is_retry, void *conn_if_sspc_onw);
508*1c60b9acSAndroid Build Coastguard Worker 
509*1c60b9acSAndroid Build Coastguard Worker lws_ss_state_return_t
510*1c60b9acSAndroid Build Coastguard Worker _lws_ss_request_tx(lws_ss_handle_t *h);
511*1c60b9acSAndroid Build Coastguard Worker 
512*1c60b9acSAndroid Build Coastguard Worker int
513*1c60b9acSAndroid Build Coastguard Worker __lws_ss_proxy_bind_ss_to_conn_wsi(void *parconn, size_t dsh_size);
514*1c60b9acSAndroid Build Coastguard Worker 
515*1c60b9acSAndroid Build Coastguard Worker struct lws_vhost *
516*1c60b9acSAndroid Build Coastguard Worker lws_ss_policy_ref_trust_store(struct lws_context *context,
517*1c60b9acSAndroid Build Coastguard Worker 			      const lws_ss_policy_t *pol, char doref);
518*1c60b9acSAndroid Build Coastguard Worker 
519*1c60b9acSAndroid Build Coastguard Worker lws_ss_state_return_t
520*1c60b9acSAndroid Build Coastguard Worker lws_sspc_event_helper(lws_sspc_handle_t *h, lws_ss_constate_t cs,
521*1c60b9acSAndroid Build Coastguard Worker 		      lws_ss_tx_ordinal_t flags);
522*1c60b9acSAndroid Build Coastguard Worker 
523*1c60b9acSAndroid Build Coastguard Worker int
524*1c60b9acSAndroid Build Coastguard Worker lws_ss_check_next_state(lws_lifecycle_t *lc, uint8_t *prevstate,
525*1c60b9acSAndroid Build Coastguard Worker 			lws_ss_constate_t cs);
526*1c60b9acSAndroid Build Coastguard Worker 
527*1c60b9acSAndroid Build Coastguard Worker int
528*1c60b9acSAndroid Build Coastguard Worker lws_ss_check_next_state_ss(lws_ss_handle_t *ss, uint8_t *prevstate,
529*1c60b9acSAndroid Build Coastguard Worker 			   lws_ss_constate_t cs);
530*1c60b9acSAndroid Build Coastguard Worker 
531*1c60b9acSAndroid Build Coastguard Worker int
532*1c60b9acSAndroid Build Coastguard Worker lws_ss_check_next_state_sspc(lws_sspc_handle_t *ss, uint8_t *prevstate,
533*1c60b9acSAndroid Build Coastguard Worker 			     lws_ss_constate_t cs);
534*1c60b9acSAndroid Build Coastguard Worker 
535*1c60b9acSAndroid Build Coastguard Worker void
536*1c60b9acSAndroid Build Coastguard Worker lws_proxy_clean_conn_ss(struct lws *wsi);
537*1c60b9acSAndroid Build Coastguard Worker 
538*1c60b9acSAndroid Build Coastguard Worker int
539*1c60b9acSAndroid Build Coastguard Worker lws_ss_cancel_notify_dll(struct lws_dll2 *d, void *user);
540*1c60b9acSAndroid Build Coastguard Worker 
541*1c60b9acSAndroid Build Coastguard Worker int
542*1c60b9acSAndroid Build Coastguard Worker lws_sspc_cancel_notify_dll(struct lws_dll2 *d, void *user);
543*1c60b9acSAndroid Build Coastguard Worker 
544*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY) || defined(LWS_WITH_SECURE_STREAMS_CPP)
545*1c60b9acSAndroid Build Coastguard Worker int
546*1c60b9acSAndroid Build Coastguard Worker lws_ss_policy_unref_trust_store(struct lws_context *context,
547*1c60b9acSAndroid Build Coastguard Worker 				const lws_ss_policy_t *pol);
548*1c60b9acSAndroid Build Coastguard Worker #endif
549*1c60b9acSAndroid Build Coastguard Worker 
550*1c60b9acSAndroid Build Coastguard Worker int
551*1c60b9acSAndroid Build Coastguard Worker lws_ss_sys_cpd(struct lws_context *cx);
552*1c60b9acSAndroid Build Coastguard Worker 
553*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SECURE_STREAMS_AUTH_SIGV4)
554*1c60b9acSAndroid Build Coastguard Worker int lws_ss_apply_sigv4(struct lws *wsi, struct lws_ss_handle *h,
555*1c60b9acSAndroid Build Coastguard Worker 		       unsigned char **p, unsigned char *end);
556*1c60b9acSAndroid Build Coastguard Worker #endif
557*1c60b9acSAndroid Build Coastguard Worker 
558*1c60b9acSAndroid Build Coastguard Worker #if defined(_DEBUG)
559*1c60b9acSAndroid Build Coastguard Worker void
560*1c60b9acSAndroid Build Coastguard Worker lws_ss_assert_extant(struct lws_context *cx, int tsi, struct lws_ss_handle *h);
561*1c60b9acSAndroid Build Coastguard Worker #else
562*1c60b9acSAndroid Build Coastguard Worker #define lws_ss_assert_extant(_a, _b, _c)
563*1c60b9acSAndroid Build Coastguard Worker #endif
564*1c60b9acSAndroid Build Coastguard Worker 
565*1c60b9acSAndroid Build Coastguard Worker typedef int (* const secstream_protocol_connect_munge_t)(lws_ss_handle_t *h,
566*1c60b9acSAndroid Build Coastguard Worker 		char *buf, size_t len, struct lws_client_connect_info *i,
567*1c60b9acSAndroid Build Coastguard Worker 		union lws_ss_contemp *ct);
568*1c60b9acSAndroid Build Coastguard Worker 
569*1c60b9acSAndroid Build Coastguard Worker typedef int (* const secstream_protocol_add_txcr_t)(lws_ss_handle_t *h, int add);
570*1c60b9acSAndroid Build Coastguard Worker 
571*1c60b9acSAndroid Build Coastguard Worker typedef int (* const secstream_protocol_get_txcr_t)(lws_ss_handle_t *h);
572*1c60b9acSAndroid Build Coastguard Worker 
573*1c60b9acSAndroid Build Coastguard Worker struct ss_pcols {
574*1c60b9acSAndroid Build Coastguard Worker 	const char					*name;
575*1c60b9acSAndroid Build Coastguard Worker 	const char					*alpn;
576*1c60b9acSAndroid Build Coastguard Worker 	const struct lws_protocols			*protocol;
577*1c60b9acSAndroid Build Coastguard Worker 	secstream_protocol_connect_munge_t		munge;
578*1c60b9acSAndroid Build Coastguard Worker 	secstream_protocol_add_txcr_t			tx_cr_add;
579*1c60b9acSAndroid Build Coastguard Worker 	secstream_protocol_get_txcr_t			tx_cr_est;
580*1c60b9acSAndroid Build Coastguard Worker };
581*1c60b9acSAndroid Build Coastguard Worker 
582*1c60b9acSAndroid Build Coastguard Worker /*
583*1c60b9acSAndroid Build Coastguard Worker  * Because both sides of the connection share the conn, we allocate it
584*1c60b9acSAndroid Build Coastguard Worker  * during accepted adoption, and both sides point to it.
585*1c60b9acSAndroid Build Coastguard Worker  *
586*1c60b9acSAndroid Build Coastguard Worker  * When .ss or .wsi close, they must NULL their entry here so no dangling
587*1c60b9acSAndroid Build Coastguard Worker  * refereneces.
588*1c60b9acSAndroid Build Coastguard Worker  *
589*1c60b9acSAndroid Build Coastguard Worker  * The last one of the accepted side and the onward side to close frees it.
590*1c60b9acSAndroid Build Coastguard Worker  */
591*1c60b9acSAndroid Build Coastguard Worker 
592*1c60b9acSAndroid Build Coastguard Worker lws_ss_state_return_t
593*1c60b9acSAndroid Build Coastguard Worker lws_conmon_ss_json(lws_ss_handle_t *h);
594*1c60b9acSAndroid Build Coastguard Worker 
595*1c60b9acSAndroid Build Coastguard Worker void
596*1c60b9acSAndroid Build Coastguard Worker ss_proxy_onward_link_req_writeable(lws_ss_handle_t *h_onward);
597*1c60b9acSAndroid Build Coastguard Worker 
598*1c60b9acSAndroid Build Coastguard Worker struct conn {
599*1c60b9acSAndroid Build Coastguard Worker 	struct lws_ss_serialization_parser parser;
600*1c60b9acSAndroid Build Coastguard Worker 
601*1c60b9acSAndroid Build Coastguard Worker 	lws_dsh_t		*dsh;	/* unified buffer for both sides */
602*1c60b9acSAndroid Build Coastguard Worker 	struct lws		*wsi;	/* the proxy's client side */
603*1c60b9acSAndroid Build Coastguard Worker 	lws_ss_handle_t		*ss;	/* the onward, ss side */
604*1c60b9acSAndroid Build Coastguard Worker 
605*1c60b9acSAndroid Build Coastguard Worker 	lws_ss_conn_states_t	state;
606*1c60b9acSAndroid Build Coastguard Worker 
607*1c60b9acSAndroid Build Coastguard Worker 	char			onward_in_flow_control;
608*1c60b9acSAndroid Build Coastguard Worker };
609*1c60b9acSAndroid Build Coastguard Worker 
610*1c60b9acSAndroid Build Coastguard Worker extern const struct ss_pcols ss_pcol_h1;
611*1c60b9acSAndroid Build Coastguard Worker extern const struct ss_pcols ss_pcol_h2;
612*1c60b9acSAndroid Build Coastguard Worker extern const struct ss_pcols ss_pcol_ws;
613*1c60b9acSAndroid Build Coastguard Worker extern const struct ss_pcols ss_pcol_mqtt;
614*1c60b9acSAndroid Build Coastguard Worker extern const struct ss_pcols ss_pcol_raw;
615*1c60b9acSAndroid Build Coastguard Worker 
616*1c60b9acSAndroid Build Coastguard Worker extern const struct lws_protocols protocol_secstream_h1;
617*1c60b9acSAndroid Build Coastguard Worker extern const struct lws_protocols protocol_secstream_h2;
618*1c60b9acSAndroid Build Coastguard Worker extern const struct lws_protocols protocol_secstream_ws;
619*1c60b9acSAndroid Build Coastguard Worker extern const struct lws_protocols protocol_secstream_mqtt;
620*1c60b9acSAndroid Build Coastguard Worker extern const struct lws_protocols protocol_secstream_raw;
621*1c60b9acSAndroid Build Coastguard Worker 
622