xref: /aosp_15_r20/external/libwebsockets/lib/roles/ws/private-lib-roles-ws.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  *  This is included from private-lib-core.h if LWS_ROLE_WS
25*1c60b9acSAndroid Build Coastguard Worker  */
26*1c60b9acSAndroid Build Coastguard Worker 
27*1c60b9acSAndroid Build Coastguard Worker extern const struct lws_role_ops role_ops_ws;
28*1c60b9acSAndroid Build Coastguard Worker 
29*1c60b9acSAndroid Build Coastguard Worker #define lwsi_role_ws(wsi) (wsi->role_ops == &role_ops_ws)
30*1c60b9acSAndroid Build Coastguard Worker 
31*1c60b9acSAndroid Build Coastguard Worker enum lws_rx_parse_state {
32*1c60b9acSAndroid Build Coastguard Worker 	LWS_RXPS_NEW,
33*1c60b9acSAndroid Build Coastguard Worker 
34*1c60b9acSAndroid Build Coastguard Worker 	LWS_RXPS_04_mask_1,
35*1c60b9acSAndroid Build Coastguard Worker 	LWS_RXPS_04_mask_2,
36*1c60b9acSAndroid Build Coastguard Worker 	LWS_RXPS_04_mask_3,
37*1c60b9acSAndroid Build Coastguard Worker 
38*1c60b9acSAndroid Build Coastguard Worker 	LWS_RXPS_04_FRAME_HDR_1,
39*1c60b9acSAndroid Build Coastguard Worker 	LWS_RXPS_04_FRAME_HDR_LEN,
40*1c60b9acSAndroid Build Coastguard Worker 	LWS_RXPS_04_FRAME_HDR_LEN16_2,
41*1c60b9acSAndroid Build Coastguard Worker 	LWS_RXPS_04_FRAME_HDR_LEN16_1,
42*1c60b9acSAndroid Build Coastguard Worker 	LWS_RXPS_04_FRAME_HDR_LEN64_8,
43*1c60b9acSAndroid Build Coastguard Worker 	LWS_RXPS_04_FRAME_HDR_LEN64_7,
44*1c60b9acSAndroid Build Coastguard Worker 	LWS_RXPS_04_FRAME_HDR_LEN64_6,
45*1c60b9acSAndroid Build Coastguard Worker 	LWS_RXPS_04_FRAME_HDR_LEN64_5,
46*1c60b9acSAndroid Build Coastguard Worker 	LWS_RXPS_04_FRAME_HDR_LEN64_4,
47*1c60b9acSAndroid Build Coastguard Worker 	LWS_RXPS_04_FRAME_HDR_LEN64_3,
48*1c60b9acSAndroid Build Coastguard Worker 	LWS_RXPS_04_FRAME_HDR_LEN64_2,
49*1c60b9acSAndroid Build Coastguard Worker 	LWS_RXPS_04_FRAME_HDR_LEN64_1,
50*1c60b9acSAndroid Build Coastguard Worker 
51*1c60b9acSAndroid Build Coastguard Worker 	LWS_RXPS_07_COLLECT_FRAME_KEY_1,
52*1c60b9acSAndroid Build Coastguard Worker 	LWS_RXPS_07_COLLECT_FRAME_KEY_2,
53*1c60b9acSAndroid Build Coastguard Worker 	LWS_RXPS_07_COLLECT_FRAME_KEY_3,
54*1c60b9acSAndroid Build Coastguard Worker 	LWS_RXPS_07_COLLECT_FRAME_KEY_4,
55*1c60b9acSAndroid Build Coastguard Worker 
56*1c60b9acSAndroid Build Coastguard Worker 	LWS_RXPS_WS_FRAME_PAYLOAD
57*1c60b9acSAndroid Build Coastguard Worker };
58*1c60b9acSAndroid Build Coastguard Worker 
59*1c60b9acSAndroid Build Coastguard Worker enum lws_websocket_opcodes_07 {
60*1c60b9acSAndroid Build Coastguard Worker 	LWSWSOPC_CONTINUATION = 0,
61*1c60b9acSAndroid Build Coastguard Worker 	LWSWSOPC_TEXT_FRAME = 1,
62*1c60b9acSAndroid Build Coastguard Worker 	LWSWSOPC_BINARY_FRAME = 2,
63*1c60b9acSAndroid Build Coastguard Worker 
64*1c60b9acSAndroid Build Coastguard Worker 	LWSWSOPC_NOSPEC__MUX = 7,
65*1c60b9acSAndroid Build Coastguard Worker 
66*1c60b9acSAndroid Build Coastguard Worker 	/* control extensions 8+ */
67*1c60b9acSAndroid Build Coastguard Worker 
68*1c60b9acSAndroid Build Coastguard Worker 	LWSWSOPC_CLOSE = 8,
69*1c60b9acSAndroid Build Coastguard Worker 	LWSWSOPC_PING = 9,
70*1c60b9acSAndroid Build Coastguard Worker 	LWSWSOPC_PONG = 0xa,
71*1c60b9acSAndroid Build Coastguard Worker };
72*1c60b9acSAndroid Build Coastguard Worker 
73*1c60b9acSAndroid Build Coastguard Worker /* this is not usable directly by user code any more, lws_close_reason() */
74*1c60b9acSAndroid Build Coastguard Worker #define LWS_WRITE_CLOSE 4
75*1c60b9acSAndroid Build Coastguard Worker 
76*1c60b9acSAndroid Build Coastguard Worker #define ALREADY_PROCESSED_IGNORE_CHAR 1
77*1c60b9acSAndroid Build Coastguard Worker #define ALREADY_PROCESSED_NO_CB 2
78*1c60b9acSAndroid Build Coastguard Worker 
79*1c60b9acSAndroid Build Coastguard Worker #if !defined(LWS_WITHOUT_EXTENSIONS)
80*1c60b9acSAndroid Build Coastguard Worker struct lws_vhost_role_ws {
81*1c60b9acSAndroid Build Coastguard Worker 	const struct lws_extension *extensions;
82*1c60b9acSAndroid Build Coastguard Worker };
83*1c60b9acSAndroid Build Coastguard Worker 
84*1c60b9acSAndroid Build Coastguard Worker struct lws_pt_role_ws {
85*1c60b9acSAndroid Build Coastguard Worker 	struct lws *rx_draining_ext_list;
86*1c60b9acSAndroid Build Coastguard Worker 	struct lws *tx_draining_ext_list;
87*1c60b9acSAndroid Build Coastguard Worker };
88*1c60b9acSAndroid Build Coastguard Worker #endif
89*1c60b9acSAndroid Build Coastguard Worker 
90*1c60b9acSAndroid Build Coastguard Worker #define PAYLOAD_BUF_SIZE 128 - 3 + LWS_PRE
91*1c60b9acSAndroid Build Coastguard Worker 
92*1c60b9acSAndroid Build Coastguard Worker struct _lws_websocket_related {
93*1c60b9acSAndroid Build Coastguard Worker 	unsigned char *rx_ubuf;
94*1c60b9acSAndroid Build Coastguard Worker #if !defined(LWS_WITHOUT_EXTENSIONS)
95*1c60b9acSAndroid Build Coastguard Worker 	const struct lws_extension *active_extensions[LWS_MAX_EXTENSIONS_ACTIVE];
96*1c60b9acSAndroid Build Coastguard Worker 	void *act_ext_user[LWS_MAX_EXTENSIONS_ACTIVE];
97*1c60b9acSAndroid Build Coastguard Worker 	struct lws *rx_draining_ext_list;
98*1c60b9acSAndroid Build Coastguard Worker 	struct lws *tx_draining_ext_list;
99*1c60b9acSAndroid Build Coastguard Worker #endif
100*1c60b9acSAndroid Build Coastguard Worker 
101*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_HTTP_PROXY)
102*1c60b9acSAndroid Build Coastguard Worker 	struct lws_dll2_owner proxy_owner;
103*1c60b9acSAndroid Build Coastguard Worker 	char actual_protocol[16];
104*1c60b9acSAndroid Build Coastguard Worker 	size_t proxy_buffered;
105*1c60b9acSAndroid Build Coastguard Worker #endif
106*1c60b9acSAndroid Build Coastguard Worker 
107*1c60b9acSAndroid Build Coastguard Worker 	/* Also used for close content... control opcode == < 128 */
108*1c60b9acSAndroid Build Coastguard Worker 	uint8_t ping_payload_buf[PAYLOAD_BUF_SIZE];
109*1c60b9acSAndroid Build Coastguard Worker 	uint8_t pong_payload_buf[PAYLOAD_BUF_SIZE];
110*1c60b9acSAndroid Build Coastguard Worker 
111*1c60b9acSAndroid Build Coastguard Worker 	unsigned int final:1;
112*1c60b9acSAndroid Build Coastguard Worker 	unsigned int frame_is_binary:1;
113*1c60b9acSAndroid Build Coastguard Worker 	unsigned int all_zero_nonce:1;
114*1c60b9acSAndroid Build Coastguard Worker 	unsigned int this_frame_masked:1;
115*1c60b9acSAndroid Build Coastguard Worker 	unsigned int inside_frame:1; /* next write will be more of frame */
116*1c60b9acSAndroid Build Coastguard Worker 	unsigned int clean_buffer:1; /* buffer not rewritten by extension */
117*1c60b9acSAndroid Build Coastguard Worker 	unsigned int payload_is_close:1; /* process as PONG, but it is close */
118*1c60b9acSAndroid Build Coastguard Worker 	unsigned int pong_pending_flag:1;
119*1c60b9acSAndroid Build Coastguard Worker 	unsigned int continuation_possible:1;
120*1c60b9acSAndroid Build Coastguard Worker 	unsigned int owed_a_fin:1;
121*1c60b9acSAndroid Build Coastguard Worker 	unsigned int check_utf8:1;
122*1c60b9acSAndroid Build Coastguard Worker 	unsigned int defeat_check_utf8:1;
123*1c60b9acSAndroid Build Coastguard Worker 	unsigned int stashed_write_pending:1;
124*1c60b9acSAndroid Build Coastguard Worker 	unsigned int send_check_ping:1;
125*1c60b9acSAndroid Build Coastguard Worker 	unsigned int first_fragment:1;
126*1c60b9acSAndroid Build Coastguard Worker 	unsigned int peer_has_sent_close:1;
127*1c60b9acSAndroid Build Coastguard Worker #if !defined(LWS_WITHOUT_EXTENSIONS)
128*1c60b9acSAndroid Build Coastguard Worker 	unsigned int extension_data_pending:1;
129*1c60b9acSAndroid Build Coastguard Worker 	unsigned int rx_draining_ext:1;
130*1c60b9acSAndroid Build Coastguard Worker 	unsigned int tx_draining_ext:1;
131*1c60b9acSAndroid Build Coastguard Worker 	unsigned int pmd_trailer_application:1;
132*1c60b9acSAndroid Build Coastguard Worker #endif
133*1c60b9acSAndroid Build Coastguard Worker 
134*1c60b9acSAndroid Build Coastguard Worker 	uint8_t mask[4];
135*1c60b9acSAndroid Build Coastguard Worker 
136*1c60b9acSAndroid Build Coastguard Worker 	size_t rx_packet_length;
137*1c60b9acSAndroid Build Coastguard Worker 	uint32_t rx_ubuf_head;
138*1c60b9acSAndroid Build Coastguard Worker 	uint32_t rx_ubuf_alloc;
139*1c60b9acSAndroid Build Coastguard Worker 
140*1c60b9acSAndroid Build Coastguard Worker 	uint8_t pong_payload_len;
141*1c60b9acSAndroid Build Coastguard Worker 	uint8_t mask_idx;
142*1c60b9acSAndroid Build Coastguard Worker 	uint8_t opcode;
143*1c60b9acSAndroid Build Coastguard Worker 	uint8_t rsv;
144*1c60b9acSAndroid Build Coastguard Worker 	uint8_t rsv_first_msg;
145*1c60b9acSAndroid Build Coastguard Worker 	/* zero if no info, or length including 2-byte close code */
146*1c60b9acSAndroid Build Coastguard Worker 	uint8_t close_in_ping_buffer_len;
147*1c60b9acSAndroid Build Coastguard Worker 	uint8_t utf8;
148*1c60b9acSAndroid Build Coastguard Worker 	uint8_t stashed_write_type;
149*1c60b9acSAndroid Build Coastguard Worker 	uint8_t tx_draining_stashed_wp;
150*1c60b9acSAndroid Build Coastguard Worker 	uint8_t ietf_spec_revision;
151*1c60b9acSAndroid Build Coastguard Worker #if !defined(LWS_WITHOUT_EXTENSIONS)
152*1c60b9acSAndroid Build Coastguard Worker 	uint8_t count_act_ext;
153*1c60b9acSAndroid Build Coastguard Worker #endif
154*1c60b9acSAndroid Build Coastguard Worker };
155*1c60b9acSAndroid Build Coastguard Worker 
156*1c60b9acSAndroid Build Coastguard Worker /*
157*1c60b9acSAndroid Build Coastguard Worker  * we need to separately track what's happening with both compressed rx in
158*1c60b9acSAndroid Build Coastguard Worker  * and with inflated rx out that will be passed to the user code
159*1c60b9acSAndroid Build Coastguard Worker  */
160*1c60b9acSAndroid Build Coastguard Worker 
161*1c60b9acSAndroid Build Coastguard Worker struct lws_ext_pm_deflate_rx_ebufs {
162*1c60b9acSAndroid Build Coastguard Worker 	struct lws_tokens eb_in;
163*1c60b9acSAndroid Build Coastguard Worker 	struct lws_tokens eb_out;
164*1c60b9acSAndroid Build Coastguard Worker };
165*1c60b9acSAndroid Build Coastguard Worker 
166*1c60b9acSAndroid Build Coastguard Worker int
167*1c60b9acSAndroid Build Coastguard Worker lws_ws_handshake_client(struct lws *wsi, unsigned char **buf, size_t len);
168*1c60b9acSAndroid Build Coastguard Worker 
169*1c60b9acSAndroid Build Coastguard Worker #if !defined(LWS_WITHOUT_EXTENSIONS)
170*1c60b9acSAndroid Build Coastguard Worker LWS_VISIBLE void
171*1c60b9acSAndroid Build Coastguard Worker lws_context_init_extensions(const struct lws_context_creation_info *info,
172*1c60b9acSAndroid Build Coastguard Worker 			    struct lws_context *context);
173*1c60b9acSAndroid Build Coastguard Worker LWS_EXTERN int
174*1c60b9acSAndroid Build Coastguard Worker lws_any_extension_handled(struct lws *wsi, enum lws_extension_callback_reasons r,
175*1c60b9acSAndroid Build Coastguard Worker 			  void *v, size_t len);
176*1c60b9acSAndroid Build Coastguard Worker 
177*1c60b9acSAndroid Build Coastguard Worker LWS_EXTERN int
178*1c60b9acSAndroid Build Coastguard Worker lws_ext_cb_active(struct lws *wsi, int reason, void *buf, int len);
179*1c60b9acSAndroid Build Coastguard Worker LWS_EXTERN int
180*1c60b9acSAndroid Build Coastguard Worker lws_ext_cb_all_exts(struct lws_context *context, struct lws *wsi, int reason,
181*1c60b9acSAndroid Build Coastguard Worker 		    void *arg, int len);
182*1c60b9acSAndroid Build Coastguard Worker #endif
183*1c60b9acSAndroid Build Coastguard Worker 
184*1c60b9acSAndroid Build Coastguard Worker int
185*1c60b9acSAndroid Build Coastguard Worker handshake_0405(struct lws_context *context, struct lws *wsi);
186*1c60b9acSAndroid Build Coastguard Worker int
187*1c60b9acSAndroid Build Coastguard Worker lws_process_ws_upgrade(struct lws *wsi);
188*1c60b9acSAndroid Build Coastguard Worker 
189*1c60b9acSAndroid Build Coastguard Worker int
190*1c60b9acSAndroid Build Coastguard Worker lws_process_ws_upgrade2(struct lws *wsi);
191*1c60b9acSAndroid Build Coastguard Worker 
192*1c60b9acSAndroid Build Coastguard Worker extern const struct lws_protocols lws_ws_proxy;
193*1c60b9acSAndroid Build Coastguard Worker 
194*1c60b9acSAndroid Build Coastguard Worker int
195*1c60b9acSAndroid Build Coastguard Worker lws_server_init_wsi_for_ws(struct lws *wsi);
196*1c60b9acSAndroid Build Coastguard Worker 
197*1c60b9acSAndroid Build Coastguard Worker void
198*1c60b9acSAndroid Build Coastguard Worker lws_sul_wsping_cb(lws_sorted_usec_list_t *sul);
199