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