Lines Matching full:wsi
35 lws_ws_rx_sm(struct lws *wsi, char already_processed, unsigned char c) in lws_ws_rx_sm() argument
53 switch (wsi->lws_rx_parse_state) { in lws_ws_rx_sm()
56 if (wsi->ws->rx_draining_ext) { in lws_ws_rx_sm()
61 lws_remove_wsi_from_draining_ext_list(wsi); in lws_ws_rx_sm()
68 switch (wsi->ws->ietf_spec_revision) { in lws_ws_rx_sm()
73 wsi->ws->all_zero_nonce = 1; in lws_ws_rx_sm()
78 wsi->ws->ietf_spec_revision); in lws_ws_rx_sm()
83 wsi->ws->mask[1] = c; in lws_ws_rx_sm()
85 wsi->ws->all_zero_nonce = 0; in lws_ws_rx_sm()
86 wsi->lws_rx_parse_state = LWS_RXPS_04_mask_2; in lws_ws_rx_sm()
89 wsi->ws->mask[2] = c; in lws_ws_rx_sm()
91 wsi->ws->all_zero_nonce = 0; in lws_ws_rx_sm()
92 wsi->lws_rx_parse_state = LWS_RXPS_04_mask_3; in lws_ws_rx_sm()
95 wsi->ws->mask[3] = c; in lws_ws_rx_sm()
97 wsi->ws->all_zero_nonce = 0; in lws_ws_rx_sm()
104 wsi->ws->mask_idx = 0; in lws_ws_rx_sm()
106 wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_1; in lws_ws_rx_sm()
142 wsi->ws->opcode = c & 0xf; in lws_ws_rx_sm()
143 wsi->ws->rsv = c & 0x70; in lws_ws_rx_sm()
144 wsi->ws->final = !!((c >> 7) & 1); in lws_ws_rx_sm()
145 wsi->ws->defeat_check_utf8 = 0; in lws_ws_rx_sm()
147 if (((wsi->ws->opcode) & 8) && !wsi->ws->final) { in lws_ws_rx_sm()
148 lws_close_reason(wsi, LWS_CLOSE_STATUS_PROTOCOL_ERR, in lws_ws_rx_sm()
153 switch (wsi->ws->opcode) { in lws_ws_rx_sm()
155 wsi->ws->check_utf8 = lws_check_opt( in lws_ws_rx_sm()
156 wsi->a.context->options, in lws_ws_rx_sm()
160 if (wsi->ws->opcode == LWSWSOPC_BINARY_FRAME) in lws_ws_rx_sm()
161 wsi->ws->check_utf8 = 0; in lws_ws_rx_sm()
162 if (wsi->ws->continuation_possible) { in lws_ws_rx_sm()
163 lws_close_reason(wsi, in lws_ws_rx_sm()
168 wsi->ws->rsv_first_msg = (c & 0x70); in lws_ws_rx_sm()
175 wsi->ws->pmd_trailer_application = !!(c & 0x40); in lws_ws_rx_sm()
177 wsi->ws->frame_is_binary = in lws_ws_rx_sm()
178 wsi->ws->opcode == LWSWSOPC_BINARY_FRAME; in lws_ws_rx_sm()
179 wsi->ws->first_fragment = 1; in lws_ws_rx_sm()
180 wsi->ws->continuation_possible = !wsi->ws->final; in lws_ws_rx_sm()
183 if (!wsi->ws->continuation_possible) { in lws_ws_rx_sm()
184 lws_close_reason(wsi, in lws_ws_rx_sm()
191 wsi->ws->check_utf8 = 0; in lws_ws_rx_sm()
192 wsi->ws->utf8 = 0; in lws_ws_rx_sm()
204 lws_close_reason(wsi, LWS_CLOSE_STATUS_PROTOCOL_ERR, in lws_ws_rx_sm()
210 if (wsi->ws->owed_a_fin && in lws_ws_rx_sm()
211 (wsi->ws->opcode == LWSWSOPC_TEXT_FRAME || in lws_ws_rx_sm()
212 wsi->ws->opcode == LWSWSOPC_BINARY_FRAME)) { in lws_ws_rx_sm()
214 lws_close_reason(wsi, LWS_CLOSE_STATUS_PROTOCOL_ERR, in lws_ws_rx_sm()
218 if ((!(wsi->ws->opcode & 8)) && wsi->ws->final) { in lws_ws_rx_sm()
219 wsi->ws->continuation_possible = 0; in lws_ws_rx_sm()
220 wsi->ws->owed_a_fin = 0; in lws_ws_rx_sm()
223 if (!wsi->ws->final) in lws_ws_rx_sm()
224 wsi->ws->owed_a_fin = 1; in lws_ws_rx_sm()
226 wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN; in lws_ws_rx_sm()
227 if (wsi->ws->rsv && in lws_ws_rx_sm()
230 !wsi->ws->count_act_ext || in lws_ws_rx_sm()
232 (wsi->ws->rsv & ~0x40))) { in lws_ws_rx_sm()
233 lws_close_reason(wsi, LWS_CLOSE_STATUS_PROTOCOL_ERR, in lws_ws_rx_sm()
241 wsi->ws->this_frame_masked = !!(c & 0x80); in lws_ws_rx_sm()
246 if (wsi->ws->opcode & 8) in lws_ws_rx_sm()
249 wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN16_2; in lws_ws_rx_sm()
253 if (wsi->ws->opcode & 8) in lws_ws_rx_sm()
256 wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN64_8; in lws_ws_rx_sm()
259 wsi->ws->rx_packet_length = c & 0x7f; in lws_ws_rx_sm()
262 if (wsi->ws->this_frame_masked) in lws_ws_rx_sm()
263 wsi->lws_rx_parse_state = in lws_ws_rx_sm()
266 if (wsi->ws->rx_packet_length) { in lws_ws_rx_sm()
267 wsi->lws_rx_parse_state = in lws_ws_rx_sm()
270 wsi->lws_rx_parse_state = LWS_RXPS_NEW; in lws_ws_rx_sm()
278 wsi->ws->rx_packet_length = (size_t)(c << 8); in lws_ws_rx_sm()
279 wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN16_1; in lws_ws_rx_sm()
283 wsi->ws->rx_packet_length |= c; in lws_ws_rx_sm()
284 if (wsi->ws->this_frame_masked) in lws_ws_rx_sm()
285 wsi->lws_rx_parse_state = in lws_ws_rx_sm()
288 wsi->lws_rx_parse_state = in lws_ws_rx_sm()
300 wsi->ws->rx_packet_length = ((size_t)c) << 56; in lws_ws_rx_sm()
302 wsi->ws->rx_packet_length = 0; in lws_ws_rx_sm()
304 wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN64_7; in lws_ws_rx_sm()
309 wsi->ws->rx_packet_length |= ((size_t)c) << 48; in lws_ws_rx_sm()
311 wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN64_6; in lws_ws_rx_sm()
316 wsi->ws->rx_packet_length |= ((size_t)c) << 40; in lws_ws_rx_sm()
318 wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN64_5; in lws_ws_rx_sm()
323 wsi->ws->rx_packet_length |= ((size_t)c) << 32; in lws_ws_rx_sm()
325 wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN64_4; in lws_ws_rx_sm()
329 wsi->ws->rx_packet_length |= ((size_t)c) << 24; in lws_ws_rx_sm()
330 wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN64_3; in lws_ws_rx_sm()
334 wsi->ws->rx_packet_length |= ((size_t)c) << 16; in lws_ws_rx_sm()
335 wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN64_2; in lws_ws_rx_sm()
339 wsi->ws->rx_packet_length |= ((size_t)c) << 8; in lws_ws_rx_sm()
340 wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN64_1; in lws_ws_rx_sm()
344 wsi->ws->rx_packet_length |= ((size_t)c); in lws_ws_rx_sm()
345 if (wsi->ws->this_frame_masked) in lws_ws_rx_sm()
346 wsi->lws_rx_parse_state = in lws_ws_rx_sm()
349 wsi->lws_rx_parse_state = LWS_RXPS_WS_FRAME_PAYLOAD; in lws_ws_rx_sm()
353 wsi->ws->mask[0] = c; in lws_ws_rx_sm()
355 wsi->ws->all_zero_nonce = 0; in lws_ws_rx_sm()
356 wsi->lws_rx_parse_state = LWS_RXPS_07_COLLECT_FRAME_KEY_2; in lws_ws_rx_sm()
360 wsi->ws->mask[1] = c; in lws_ws_rx_sm()
362 wsi->ws->all_zero_nonce = 0; in lws_ws_rx_sm()
363 wsi->lws_rx_parse_state = LWS_RXPS_07_COLLECT_FRAME_KEY_3; in lws_ws_rx_sm()
367 wsi->ws->mask[2] = c; in lws_ws_rx_sm()
369 wsi->ws->all_zero_nonce = 0; in lws_ws_rx_sm()
370 wsi->lws_rx_parse_state = LWS_RXPS_07_COLLECT_FRAME_KEY_4; in lws_ws_rx_sm()
374 wsi->ws->mask[3] = c; in lws_ws_rx_sm()
376 wsi->ws->all_zero_nonce = 0; in lws_ws_rx_sm()
377 wsi->lws_rx_parse_state = LWS_RXPS_WS_FRAME_PAYLOAD; in lws_ws_rx_sm()
378 wsi->ws->mask_idx = 0; in lws_ws_rx_sm()
379 if (wsi->ws->rx_packet_length == 0) { in lws_ws_rx_sm()
380 wsi->lws_rx_parse_state = LWS_RXPS_NEW; in lws_ws_rx_sm()
387 assert(wsi->ws->rx_ubuf); in lws_ws_rx_sm()
389 if (wsi->ws->rx_ubuf_head + LWS_PRE >= wsi->ws->rx_ubuf_alloc) { in lws_ws_rx_sm()
394 if (wsi->ws->all_zero_nonce) in lws_ws_rx_sm()
395 wsi->ws->rx_ubuf[LWS_PRE + in lws_ws_rx_sm()
396 (wsi->ws->rx_ubuf_head++)] = c; in lws_ws_rx_sm()
398 wsi->ws->rx_ubuf[LWS_PRE + in lws_ws_rx_sm()
399 (wsi->ws->rx_ubuf_head++)] = in lws_ws_rx_sm()
400 c ^ wsi->ws->mask[(wsi->ws->mask_idx++) & 3]; in lws_ws_rx_sm()
402 --wsi->ws->rx_packet_length; in lws_ws_rx_sm()
405 if (!wsi->ws->rx_packet_length) { in lws_ws_rx_sm()
409 wsi->lws_rx_parse_state = LWS_RXPS_NEW; in lws_ws_rx_sm()
413 if (wsi->ws->rx_draining_ext) { in lws_ws_rx_sm()
422 if (!wsi->a.protocol->rx_buffer_size && in lws_ws_rx_sm()
423 wsi->ws->rx_ubuf_head != wsi->a.context->pt_serv_buf_size) in lws_ws_rx_sm()
426 if (wsi->a.protocol->rx_buffer_size && in lws_ws_rx_sm()
427 wsi->ws->rx_ubuf_head != wsi->a.protocol->rx_buffer_size) in lws_ws_rx_sm()
437 lwsl_parser("spill on %s\n", wsi->a.protocol->name); in lws_ws_rx_sm()
439 switch (wsi->ws->opcode) { in lws_ws_rx_sm()
442 if (wsi->ws->peer_has_sent_close) in lws_ws_rx_sm()
445 wsi->ws->peer_has_sent_close = 1; in lws_ws_rx_sm()
447 pp = &wsi->ws->rx_ubuf[LWS_PRE]; in lws_ws_rx_sm()
448 if (lws_check_opt(wsi->a.context->options, in lws_ws_rx_sm()
450 wsi->ws->rx_ubuf_head > 2 && in lws_ws_rx_sm()
451 lws_check_utf8(&wsi->ws->utf8, pp + 2, in lws_ws_rx_sm()
452 wsi->ws->rx_ubuf_head - 2)) in lws_ws_rx_sm()
456 if (lwsi_state(wsi) == LRS_AWAITING_CLOSE_ACK) { in lws_ws_rx_sm()
464 if (lwsi_state(wsi) == LRS_RETURNED_CLOSE) in lws_ws_rx_sm()
468 if (lws_partial_buffered(wsi)) { in lws_ws_rx_sm()
474 wsi->socket_is_permanently_unusable = 1; in lws_ws_rx_sm()
480 if (wsi->ws->rx_ubuf_head >= 2) { in lws_ws_rx_sm()
498 wsi->a.protocol->callback, wsi, in lws_ws_rx_sm()
500 wsi->user_space, in lws_ws_rx_sm()
501 &wsi->ws->rx_ubuf[LWS_PRE], in lws_ws_rx_sm()
502 wsi->ws->rx_ubuf_head)) in lws_ws_rx_sm()
506 lwsi_set_state(wsi, LRS_RETURNED_CLOSE); in lws_ws_rx_sm()
508 wsi->ws->payload_is_close = 1; in lws_ws_rx_sm()
513 (int)wsi->ws->rx_ubuf_head); in lws_ws_rx_sm()
515 if (wsi->ws->pong_pending_flag) { in lws_ws_rx_sm()
525 if (wsi->ws->rx_ubuf_head > 128 - 3) { in lws_ws_rx_sm()
531 memcpy(wsi->ws->pong_payload_buf + LWS_PRE, in lws_ws_rx_sm()
532 &wsi->ws->rx_ubuf[LWS_PRE], in lws_ws_rx_sm()
533 wsi->ws->rx_ubuf_head); in lws_ws_rx_sm()
535 wsi->ws->pong_payload_len = (uint8_t)wsi->ws->rx_ubuf_head; in lws_ws_rx_sm()
536 wsi->ws->pong_pending_flag = 1; in lws_ws_rx_sm()
539 lws_callback_on_writable(wsi); in lws_ws_rx_sm()
541 wsi->ws->rx_ubuf_head = 0; in lws_ws_rx_sm()
546 lwsl_hexdump(&wsi->ws->rx_ubuf[LWS_PRE], in lws_ws_rx_sm()
547 wsi->ws->rx_ubuf_head); in lws_ws_rx_sm()
549 lws_validity_confirmed(wsi); in lws_ws_rx_sm()
561 lwsl_parser("unknown opc %x\n", wsi->ws->opcode); in lws_ws_rx_sm()
581 pmdrx.eb_in.token = &wsi->ws->rx_ubuf[LWS_PRE]; in lws_ws_rx_sm()
582 pmdrx.eb_in.len = (int)wsi->ws->rx_ubuf_head; in lws_ws_rx_sm()
588 if (wsi->ws->opcode == LWSWSOPC_PONG && !pmdrx.eb_in.len) in lws_ws_rx_sm()
599 if (lwsi_state(wsi) == LRS_RETURNED_CLOSE || in lws_ws_rx_sm()
600 lwsi_state(wsi) == LRS_AWAITING_CLOSE_ACK) in lws_ws_rx_sm()
612 n = lws_ext_cb_active(wsi, LWS_EXT_CB_PAYLOAD_RX, &pmdrx, 0); in lws_ws_rx_sm()
615 if (wsi->ws->rx_draining_ext) in lws_ws_rx_sm()
629 wsi->socket_is_permanently_unusable = 1; in lws_ws_rx_sm()
651 lws_add_wsi_to_draining_ext_list(wsi); in lws_ws_rx_sm()
653 lws_remove_wsi_from_draining_ext_list(wsi); in lws_ws_rx_sm()
655 rx_draining_ext = wsi->ws->rx_draining_ext; in lws_ws_rx_sm()
659 wsi->ws->check_utf8 && !wsi->ws->defeat_check_utf8) { in lws_ws_rx_sm()
660 if (lws_check_utf8(&wsi->ws->utf8, in lws_ws_rx_sm()
663 lws_close_reason(wsi, in lws_ws_rx_sm()
670 if (!wsi->ws->rx_packet_length && in lws_ws_rx_sm()
671 wsi->ws->final && wsi->ws->utf8 in lws_ws_rx_sm()
678 lws_close_reason(wsi, in lws_ws_rx_sm()
701 if (!wsi->wsistate_pre_close && in lws_ws_rx_sm()
708 if (wsi->a.protocol->callback && in lws_ws_rx_sm()
715 wsi->a.protocol->callback, wsi, in lws_ws_rx_sm()
718 wsi->user_space, in lws_ws_rx_sm()
722 wsi->ws->first_fragment = 0; in lws_ws_rx_sm()
737 wsi->ws->rx_ubuf_head = 0; in lws_ws_rx_sm()
752 lws_remaining_packet_payload(struct lws *wsi) in lws_remaining_packet_payload() argument
754 return wsi->ws->rx_packet_length; in lws_remaining_packet_payload()
757 int lws_frame_is_binary(struct lws *wsi) in lws_frame_is_binary() argument
759 return wsi->ws->frame_is_binary; in lws_frame_is_binary()
763 lws_add_wsi_to_draining_ext_list(struct lws *wsi) in lws_add_wsi_to_draining_ext_list() argument
766 struct lws_context_per_thread *pt = &wsi->a.context->pt[(int)wsi->tsi]; in lws_add_wsi_to_draining_ext_list()
768 if (wsi->ws->rx_draining_ext) in lws_add_wsi_to_draining_ext_list()
773 wsi->ws->rx_draining_ext = 1; in lws_add_wsi_to_draining_ext_list()
774 wsi->ws->rx_draining_ext_list = pt->ws.rx_draining_ext_list; in lws_add_wsi_to_draining_ext_list()
775 pt->ws.rx_draining_ext_list = wsi; in lws_add_wsi_to_draining_ext_list()
780 lws_remove_wsi_from_draining_ext_list(struct lws *wsi) in lws_remove_wsi_from_draining_ext_list() argument
783 struct lws_context_per_thread *pt = &wsi->a.context->pt[(int)wsi->tsi]; in lws_remove_wsi_from_draining_ext_list()
786 if (!wsi->ws->rx_draining_ext) in lws_remove_wsi_from_draining_ext_list()
791 wsi->ws->rx_draining_ext = 0; in lws_remove_wsi_from_draining_ext_list()
795 if (*w == wsi) { in lws_remove_wsi_from_draining_ext_list()
797 *w = wsi->ws->rx_draining_ext_list; in lws_remove_wsi_from_draining_ext_list()
802 wsi->ws->rx_draining_ext_list = NULL; in lws_remove_wsi_from_draining_ext_list()
807 lws_0405_frame_mask_generate(struct lws *wsi) in lws_0405_frame_mask_generate() argument
812 n = lws_get_random(lws_get_context(wsi), wsi->ws->mask, 4); in lws_0405_frame_mask_generate()
820 wsi->ws->mask_idx = 0; in lws_0405_frame_mask_generate()
826 lws_server_init_wsi_for_ws(struct lws *wsi) in lws_server_init_wsi_for_ws() argument
830 lwsi_set_state(wsi, LRS_ESTABLISHED); in lws_server_init_wsi_for_ws()
838 n = (int)wsi->a.protocol->rx_buffer_size; in lws_server_init_wsi_for_ws()
840 n = (int)wsi->a.context->pt_serv_buf_size; in lws_server_init_wsi_for_ws()
842 wsi->ws->rx_ubuf = lws_malloc((unsigned int)n + 4 /* 0x0000ffff zlib */, "rx_ubuf"); in lws_server_init_wsi_for_ws()
843 if (!wsi->ws->rx_ubuf) { in lws_server_init_wsi_for_ws()
847 wsi->ws->rx_ubuf_alloc = (uint32_t)n; in lws_server_init_wsi_for_ws()
851 if (wsi->a.protocol->callback) in lws_server_init_wsi_for_ws()
852 if (wsi->a.protocol->callback(wsi, LWS_CALLBACK_ESTABLISHED, in lws_server_init_wsi_for_ws()
853 wsi->user_space, in lws_server_init_wsi_for_ws()
855 wsi->tls.ssl, in lws_server_init_wsi_for_ws()
859 wsi->h2_stream_carries_ws)) in lws_server_init_wsi_for_ws()
862 lws_validity_confirmed(wsi); in lws_server_init_wsi_for_ws()
871 lws_is_final_fragment(struct lws *wsi) in lws_is_final_fragment() argument
875 wsi->ws->final, (long)wsi->ws->rx_packet_length, in lws_is_final_fragment()
876 (long)wsi->ws->rx_draining_ext); in lws_is_final_fragment()
877 return wsi->ws->final && !wsi->ws->rx_packet_length && in lws_is_final_fragment()
878 !wsi->ws->rx_draining_ext; in lws_is_final_fragment()
880 return wsi->ws->final && !wsi->ws->rx_packet_length; in lws_is_final_fragment()
885 lws_is_first_fragment(struct lws *wsi) in lws_is_first_fragment() argument
887 return wsi->ws->first_fragment; in lws_is_first_fragment()
891 lws_get_reserved_bits(struct lws *wsi) in lws_get_reserved_bits() argument
893 return wsi->ws->rsv; in lws_get_reserved_bits()
897 lws_get_close_length(struct lws *wsi) in lws_get_close_length() argument
899 return wsi->ws->close_in_ping_buffer_len; in lws_get_close_length()
903 lws_get_close_payload(struct lws *wsi) in lws_get_close_payload() argument
905 return &wsi->ws->ping_payload_buf[LWS_PRE]; in lws_get_close_payload()
909 lws_close_reason(struct lws *wsi, enum lws_close_status status, in lws_close_reason() argument
913 int budget = sizeof(wsi->ws->ping_payload_buf) - LWS_PRE; in lws_close_reason()
915 assert(lwsi_role_ws(wsi)); in lws_close_reason()
917 start = p = &wsi->ws->ping_payload_buf[LWS_PRE]; in lws_close_reason()
926 wsi->ws->close_in_ping_buffer_len = (uint8_t)lws_ptr_diff(p, start); in lws_close_reason()
930 lws_is_ws_with_ext(struct lws *wsi) in lws_is_ws_with_ext() argument
935 return lwsi_role_ws(wsi) && !!wsi->ws->count_act_ext; in lws_is_ws_with_ext()
940 rops_handle_POLLIN_ws(struct lws_context_per_thread *pt, struct lws *wsi, in rops_handle_POLLIN_ws() argument
951 if (!wsi->ws) { in rops_handle_POLLIN_ws()
952 lwsl_err("ws role wsi with no ws\n"); in rops_handle_POLLIN_ws()
956 // lwsl_notice("%s: %s\n", __func__, wsi->a.protocol->name); in rops_handle_POLLIN_ws()
959 // wsi->wsistate, pollfd->revents & LWS_POLLOUT); in rops_handle_POLLIN_ws()
965 if (lwsi_state(wsi) == LRS_PRE_WS_SERVING_ACCEPT) { in rops_handle_POLLIN_ws()
966 wsi->socket_is_permanently_unusable = 1; in rops_handle_POLLIN_ws()
973 if (lwsi_state(wsi) == LRS_WAITING_CONNECT) { in rops_handle_POLLIN_ws()
976 lws_handle_POLLOUT_event(wsi, pollfd)) { in rops_handle_POLLIN_ws()
981 n = lws_http_client_socket_service(wsi, pollfd); in rops_handle_POLLIN_ws()
991 lwsi_state_can_handle_POLLOUT(wsi) && in rops_handle_POLLIN_ws()
992 lws_handle_POLLOUT_event(wsi, pollfd)) { in rops_handle_POLLIN_ws()
993 if (lwsi_state(wsi) == LRS_RETURNED_CLOSE) in rops_handle_POLLIN_ws()
994 lwsi_set_state(wsi, LRS_FLUSHING_BEFORE_CLOSE); in rops_handle_POLLIN_ws()
999 if (lwsi_state(wsi) == LRS_RETURNED_CLOSE || in rops_handle_POLLIN_ws()
1000 lwsi_state(wsi) == LRS_WAITING_TO_SEND_CLOSE) { in rops_handle_POLLIN_ws()
1006 lws_rx_flow_control(wsi, 1); in rops_handle_POLLIN_ws()
1008 if (wsi->ws) in rops_handle_POLLIN_ws()
1009 wsi->ws->tx_draining_ext = 0; in rops_handle_POLLIN_ws()
1013 if (wsi->ws->tx_draining_ext) { in rops_handle_POLLIN_ws()
1014 lws_handle_POLLOUT_event(wsi, pollfd); in rops_handle_POLLIN_ws()
1019 * the wsi rx buf that may be needed to retain state. in rops_handle_POLLIN_ws()
1024 lws_callback_on_writable(wsi); in rops_handle_POLLIN_ws()
1028 if ((pollfd->revents & LWS_POLLIN) && lws_is_flowcontrolled(wsi)) { in rops_handle_POLLIN_ws()
1034 if (__lws_change_pollfd(wsi, LWS_POLLIN, 0)) in rops_handle_POLLIN_ws()
1040 if (lws_is_flowcontrolled(wsi)) in rops_handle_POLLIN_ws()
1044 if (wsi->mux_substream || wsi->upgraded_to_http2) { in rops_handle_POLLIN_ws()
1045 wsi1 = lws_get_network_wsi(wsi); in rops_handle_POLLIN_ws()
1060 if (wsi->ws->rx_draining_ext) { in rops_handle_POLLIN_ws()
1064 if (lwsi_role_client(wsi)) { in rops_handle_POLLIN_ws()
1065 n = lws_ws_client_rx_sm(wsi, 0); in rops_handle_POLLIN_ws()
1067 /* we closed wsi */ in rops_handle_POLLIN_ws()
1071 n = lws_ws_rx_sm(wsi, ALREADY_PROCESSED_IGNORE_CHAR, 0); in rops_handle_POLLIN_ws()
1076 if (wsi->ws->rx_draining_ext) in rops_handle_POLLIN_ws()
1088 //lws_buflist_describe(&wsi->buflist, wsi, __func__); in rops_handle_POLLIN_ws()
1089 ebuf.len = (int)lws_buflist_next_segment_len(&wsi->buflist, in rops_handle_POLLIN_ws()
1097 if (!(pollfd->revents & pollfd->events & LWS_POLLIN) && !wsi->http.ah) in rops_handle_POLLIN_ws()
1100 if (lws_is_flowcontrolled(wsi)) { in rops_handle_POLLIN_ws()
1102 __func__, wsi, wsi->rxflow_bitmap); in rops_handle_POLLIN_ws()
1106 if (!(lwsi_role_client(wsi) && in rops_handle_POLLIN_ws()
1107 (lwsi_state(wsi) != LRS_ESTABLISHED && in rops_handle_POLLIN_ws()
1108 lwsi_state(wsi) != LRS_AWAITING_CLOSE_ACK && in rops_handle_POLLIN_ws()
1109 lwsi_state(wsi) != LRS_H2_WAITING_TO_SEND_HEADERS))) { in rops_handle_POLLIN_ws()
1122 if (lwsi_role_ws(wsi)) in rops_handle_POLLIN_ws()
1123 ebuf.len = (int)wsi->ws->rx_ubuf_alloc; in rops_handle_POLLIN_ws()
1125 ebuf.len = (int)wsi->a.context->pt_serv_buf_size; in rops_handle_POLLIN_ws()
1127 if ((unsigned int)ebuf.len > wsi->a.context->pt_serv_buf_size) in rops_handle_POLLIN_ws()
1128 ebuf.len = (int)wsi->a.context->pt_serv_buf_size; in rops_handle_POLLIN_ws()
1133 ebuf.len = lws_ssl_capable_read(wsi, ebuf.token, in rops_handle_POLLIN_ws()
1174 //lws_buflist_describe(&wsi->buflist, wsi, __func__); in rops_handle_POLLIN_ws()
1177 if (lwsi_role_h2(wsi) && lwsi_state(wsi) != LRS_BODY && in rops_handle_POLLIN_ws()
1178 lwsi_state(wsi) != LRS_DISCARD_BODY) in rops_handle_POLLIN_ws()
1179 n = lws_read_h2(wsi, ebuf.token, in rops_handle_POLLIN_ws()
1183 n = lws_read_h1(wsi, ebuf.token, in rops_handle_POLLIN_ws()
1187 /* we closed wsi */ in rops_handle_POLLIN_ws()
1190 //lws_buflist_describe(&wsi->buflist, wsi, __func__); in rops_handle_POLLIN_ws()
1193 lws_buflist_aware_finished_consuming(wsi, &ebuf, n, in rops_handle_POLLIN_ws()
1202 if (wsi->http.ah in rops_handle_POLLIN_ws()
1204 && !wsi->client_h2_alpn in rops_handle_POLLIN_ws()
1207 lwsl_info("%s: %p: detaching ah\n", __func__, wsi); in rops_handle_POLLIN_ws()
1208 lws_header_table_detach(wsi, 0); in rops_handle_POLLIN_ws()
1211 pending = (unsigned int)lws_ssl_pending(wsi); in rops_handle_POLLIN_ws()
1214 if (!pending && (wsi->flags & LCCSCF_PRIORITIZE_READS) && in rops_handle_POLLIN_ws()
1215 lws_buflist_total_len(&wsi->buflist)) in rops_handle_POLLIN_ws()
1220 if (lws_is_ws_with_ext(wsi)) in rops_handle_POLLIN_ws()
1221 pending = pending > wsi->ws->rx_ubuf_alloc ? in rops_handle_POLLIN_ws()
1222 wsi->ws->rx_ubuf_alloc : pending; in rops_handle_POLLIN_ws()
1224 pending = pending > wsi->a.context->pt_serv_buf_size ? in rops_handle_POLLIN_ws()
1225 wsi->a.context->pt_serv_buf_size : pending; in rops_handle_POLLIN_ws()
1237 !lws_buflist_next_segment_len(&wsi->buflist, NULL)) { in rops_handle_POLLIN_ws()
1238 lwsl_info("%s: %p flow buf: drained\n", __func__, wsi); in rops_handle_POLLIN_ws()
1243 __lws_rx_flow_control(wsi); in rops_handle_POLLIN_ws()
1252 int rops_handle_POLLOUT_ws(struct lws *wsi) in rops_handle_POLLOUT_ws() argument
1262 lwsl_debug("%s: %s: wsi->ws->tx_draining_ext %d\n", __func__, in rops_handle_POLLOUT_ws()
1263 wsi->a.protocol->name, wsi->ws->tx_draining_ext); in rops_handle_POLLOUT_ws()
1271 if (lwsi_state(wsi) == LRS_WAITING_TO_SEND_CLOSE) { in rops_handle_POLLOUT_ws()
1273 lwsl_hexdump_debug(&wsi->ws->ping_payload_buf[LWS_PRE], in rops_handle_POLLOUT_ws()
1274 wsi->ws->close_in_ping_buffer_len); in rops_handle_POLLOUT_ws()
1275 wsi->waiting_to_send_close_frame = 0; in rops_handle_POLLOUT_ws()
1276 n = lws_write(wsi, &wsi->ws->ping_payload_buf[LWS_PRE], in rops_handle_POLLOUT_ws()
1277 wsi->ws->close_in_ping_buffer_len, in rops_handle_POLLOUT_ws()
1280 if (wsi->close_needs_ack) { in rops_handle_POLLOUT_ws()
1281 lwsi_set_state(wsi, LRS_AWAITING_CLOSE_ACK); in rops_handle_POLLOUT_ws()
1282 lws_set_timeout(wsi, PENDING_TIMEOUT_CLOSE_ACK, in rops_handle_POLLOUT_ws()
1288 wsi->close_needs_ack = 0; in rops_handle_POLLOUT_ws()
1289 lwsi_set_state(wsi, LRS_RETURNED_CLOSE); in rops_handle_POLLOUT_ws()
1297 if ((lwsi_role_ws(wsi) && wsi->ws->pong_pending_flag) || in rops_handle_POLLOUT_ws()
1298 (lwsi_state(wsi) == LRS_RETURNED_CLOSE && in rops_handle_POLLOUT_ws()
1299 wsi->ws->payload_is_close)) { in rops_handle_POLLOUT_ws()
1301 if (wsi->ws->payload_is_close) in rops_handle_POLLOUT_ws()
1304 if (wsi->wsistate_pre_close) { in rops_handle_POLLOUT_ws()
1306 wsi->ws->pong_pending_flag = 0; in rops_handle_POLLOUT_ws()
1310 wsi->ws->pong_payload_len, lws_wsi_tag(wsi)); in rops_handle_POLLOUT_ws()
1313 n = lws_write(wsi, &wsi->ws->pong_payload_buf[LWS_PRE], in rops_handle_POLLOUT_ws()
1314 wsi->ws->pong_payload_len, (enum lws_write_protocol)write_type); in rops_handle_POLLOUT_ws()
1319 wsi->ws->pong_pending_flag = 0; in rops_handle_POLLOUT_ws()
1320 if (wsi->ws->payload_is_close) { in rops_handle_POLLOUT_ws()
1330 if (!wsi->socket_is_permanently_unusable && in rops_handle_POLLOUT_ws()
1331 wsi->ws->send_check_ping) { in rops_handle_POLLOUT_ws()
1333 lwsl_info("%s: issuing ping on wsi %s: %s %s h2: %d\n", __func__, in rops_handle_POLLOUT_ws()
1334 lws_wsi_tag(wsi), in rops_handle_POLLOUT_ws()
1335 wsi->role_ops->name, wsi->a.protocol->name, in rops_handle_POLLOUT_ws()
1336 wsi->mux_substream); in rops_handle_POLLOUT_ws()
1337 wsi->ws->send_check_ping = 0; in rops_handle_POLLOUT_ws()
1338 n = lws_write(wsi, &wsi->ws->ping_payload_buf[LWS_PRE], in rops_handle_POLLOUT_ws()
1349 if (lwsi_state(wsi) == LRS_RETURNED_CLOSE) in rops_handle_POLLOUT_ws()
1360 if (wsi->ws->tx_draining_ext) { in rops_handle_POLLOUT_ws()
1362 if (lws_write(wsi, NULL, 0, LWS_WRITE_CONTINUATION) < 0) in rops_handle_POLLOUT_ws()
1370 if (!wsi->ws->extension_data_pending && !wsi->ws->tx_draining_ext) { in rops_handle_POLLOUT_ws()
1371 lwsl_ext("%s: !wsi->ws->extension_data_pending\n", __func__); in rops_handle_POLLOUT_ws()
1384 if (wsi->role_ops == &role_ops_raw_skt in rops_handle_POLLOUT_ws()
1386 || wsi->role_ops == &role_ops_raw_file in rops_handle_POLLOUT_ws()
1401 m = lws_ext_cb_active(wsi, LWS_EXT_CB_PACKET_TX_PRESEND, in rops_handle_POLLOUT_ws()
1417 n = lws_issue_raw(wsi, (unsigned char *)pmdrx.eb_in.token, in rops_handle_POLLOUT_ws()
1444 if (!lws_send_pipe_choked(wsi)) in rops_handle_POLLOUT_ws()
1460 wsi->ws->extension_data_pending = 0; in rops_handle_POLLOUT_ws()
1471 struct lws *wsi; in rops_service_flag_pending_ws() local
1480 wsi = pt->ws.rx_draining_ext_list; in rops_service_flag_pending_ws()
1481 while (wsi && wsi->position_in_fds_table != LWS_NO_FDS_POS) { in rops_service_flag_pending_ws()
1482 pt->fds[wsi->position_in_fds_table].revents = in rops_service_flag_pending_ws()
1483 (short)((short)pt->fds[wsi->position_in_fds_table].revents | in rops_service_flag_pending_ws()
1484 (short)(pt->fds[wsi->position_in_fds_table].events & LWS_POLLIN)); in rops_service_flag_pending_ws()
1485 if (pt->fds[wsi->position_in_fds_table].revents & LWS_POLLIN) in rops_service_flag_pending_ws()
1488 wsi = wsi->ws->rx_draining_ext_list; in rops_service_flag_pending_ws()
1498 rops_close_via_role_protocol_ws(struct lws *wsi, enum lws_close_status reason) in rops_close_via_role_protocol_ws() argument
1500 if (!wsi->ws) in rops_close_via_role_protocol_ws()
1503 if (!wsi->ws->close_in_ping_buffer_len && /* already a reason */ in rops_close_via_role_protocol_ws()
1512 if (!wsi->ws->close_in_ping_buffer_len) { in rops_close_via_role_protocol_ws()
1513 wsi->ws->close_in_ping_buffer_len = 2; in rops_close_via_role_protocol_ws()
1514 wsi->ws->ping_payload_buf[LWS_PRE] = (reason >> 8) & 0xff; in rops_close_via_role_protocol_ws()
1515 wsi->ws->ping_payload_buf[LWS_PRE + 1] = reason & 0xff; in rops_close_via_role_protocol_ws()
1518 wsi->waiting_to_send_close_frame = 1; in rops_close_via_role_protocol_ws()
1519 wsi->close_needs_ack = 1; in rops_close_via_role_protocol_ws()
1520 lwsi_set_state(wsi, LRS_WAITING_TO_SEND_CLOSE); in rops_close_via_role_protocol_ws()
1521 __lws_set_timeout(wsi, PENDING_TIMEOUT_CLOSE_SEND, 5); in rops_close_via_role_protocol_ws()
1523 lws_callback_on_writable(wsi); in rops_close_via_role_protocol_ws()
1529 rops_close_role_ws(struct lws_context_per_thread *pt, struct lws *wsi) in rops_close_role_ws() argument
1531 if (!wsi->ws) in rops_close_role_ws()
1536 if (wsi->ws->rx_draining_ext) { in rops_close_role_ws()
1539 wsi->ws->rx_draining_ext = 0; in rops_close_role_ws()
1542 if (*w == wsi) { in rops_close_role_ws()
1543 *w = wsi->ws->rx_draining_ext_list; in rops_close_role_ws()
1548 wsi->ws->rx_draining_ext_list = NULL; in rops_close_role_ws()
1551 if (wsi->ws->tx_draining_ext) { in rops_close_role_ws()
1554 wsi->ws->tx_draining_ext = 0; in rops_close_role_ws()
1557 if (*w == wsi) { in rops_close_role_ws()
1558 *w = wsi->ws->tx_draining_ext_list; in rops_close_role_ws()
1563 wsi->ws->tx_draining_ext_list = NULL; in rops_close_role_ws()
1566 lws_free_set_NULL(wsi->ws->rx_ubuf); in rops_close_role_ws()
1568 wsi->ws->pong_payload_len = 0; in rops_close_role_ws()
1569 wsi->ws->pong_pending_flag = 0; in rops_close_role_ws()
1573 if (lws_ext_cb_active(wsi, LWS_EXT_CB_DESTROY, NULL, 0) < 0) in rops_close_role_ws()
1580 rops_write_role_protocol_ws(struct lws *wsi, unsigned char *buf, size_t len, in rops_write_role_protocol_ws() argument
1584 struct lws_context_per_thread *pt = &wsi->a.context->pt[(int)wsi->tsi]; in rops_write_role_protocol_ws()
1588 int masked7 = lwsi_role_client(wsi); in rops_write_role_protocol_ws()
1596 if (wsi->ws->tx_draining_ext) { in rops_write_role_protocol_ws()
1601 wsi->ws->tx_draining_ext = 0; in rops_write_role_protocol_ws()
1604 if (*w == wsi) { in rops_write_role_protocol_ws()
1605 *w = wsi->ws->tx_draining_ext_list; in rops_write_role_protocol_ws()
1610 wsi->ws->tx_draining_ext_list = NULL; in rops_write_role_protocol_ws()
1613 *wp = (wsi->ws->tx_draining_stashed_wp & 0xc0) | in rops_write_role_protocol_ws()
1627 wsi->ws->tx_draining_stashed_wp, wpt); in rops_write_role_protocol_ws()
1642 if (wsi->ws->inside_frame) { in rops_write_role_protocol_ws()
1647 wsi->ws->clean_buffer = 1; in rops_write_role_protocol_ws()
1677 n = lws_ext_cb_active(wsi, (int)LWS_EXT_CB_PAYLOAD_TX, &pmdrx, (int)*wp); in rops_write_role_protocol_ws()
1691 wsi->ws->tx_draining_ext = 1; in rops_write_role_protocol_ws()
1692 wsi->ws->tx_draining_ext_list = in rops_write_role_protocol_ws()
1694 pt->ws.tx_draining_ext_list = wsi; in rops_write_role_protocol_ws()
1696 lws_callback_on_writable(wsi); in rops_write_role_protocol_ws()
1702 wsi->ws->tx_draining_stashed_wp = (uint8_t)*wp; in rops_write_role_protocol_ws()
1716 if (pmdrx.eb_out.len && wsi->ws->stashed_write_pending) { in rops_write_role_protocol_ws()
1717 wsi->ws->stashed_write_pending = 0; in rops_write_role_protocol_ws()
1718 *wp = (unsigned int)(((*wp) & 0xc0) | (unsigned int)wsi->ws->stashed_write_type); in rops_write_role_protocol_ws()
1734 if (!wsi->ws->stashed_write_pending) in rops_write_role_protocol_ws()
1735 wsi->ws->stashed_write_type = in rops_write_role_protocol_ws()
1737 wsi->ws->stashed_write_pending = 1; in rops_write_role_protocol_ws()
1744 wsi->ws->clean_buffer = 0; in rops_write_role_protocol_ws()
1755 switch (wsi->ws->ietf_spec_revision) { in rops_write_role_protocol_ws()
1834 if (!wsi->ws->inside_frame) in rops_write_role_protocol_ws()
1835 if (lws_0405_frame_mask_generate(wsi)) { in rops_write_role_protocol_ws()
1845 dropmask[n] = dropmask[n] ^ wsi->ws->mask[ in rops_write_role_protocol_ws()
1846 (wsi->ws->mask_idx++) & 3]; in rops_write_role_protocol_ws()
1849 memcpy(dropmask, wsi->ws->mask, 4); in rops_write_role_protocol_ws()
1853 if (lwsi_role_h2_ENCAPSULATION(wsi)) { in rops_write_role_protocol_ws()
1854 struct lws *encap = lws_get_network_wsi(wsi); in rops_write_role_protocol_ws()
1856 assert(encap != wsi); in rops_write_role_protocol_ws()
1860 write_role_protocol(wsi, buf - pre, in rops_write_role_protocol_ws()
1868 if (!wsi->h2_stream_carries_ws) { in rops_write_role_protocol_ws()
1886 * incomplete, ie, if wsi->ws->clean_buffer is 0 in rops_write_role_protocol_ws()
1888 * wsi->ws->clean_buffer is 1, it will instead return in rops_write_role_protocol_ws()
1893 n = lws_issue_raw_ext_access(wsi, buf - pre, len + (unsigned int)pre); in rops_write_role_protocol_ws()
1894 wsi->ws->inside_frame = 1; in rops_write_role_protocol_ws()
1901 wsi->ws->inside_frame = 0; in rops_write_role_protocol_ws()
1920 return lws_issue_raw(wsi, (unsigned char *)buf - pre, len + (unsigned int)pre); in rops_write_role_protocol_ws()
1924 rops_close_kill_connection_ws(struct lws *wsi, enum lws_close_status reason) in rops_close_kill_connection_ws() argument
1928 if (wsi->mux_substream && wsi->h2_stream_carries_ws) in rops_close_kill_connection_ws()
1931 close_kill_connection(wsi, reason); in rops_close_kill_connection_ws()
1940 rops_callback_on_writable_ws(struct lws *wsi) in rops_callback_on_writable_ws() argument
1943 if (lwsi_role_h2_ENCAPSULATION(wsi)) { in rops_callback_on_writable_ws()
1947 encapsulation_parent(wsi); in rops_callback_on_writable_ws()
1952 callback_on_writable(wsi)) in rops_callback_on_writable_ws()
2030 rops_destroy_role_ws(struct lws *wsi) in rops_destroy_role_ws() argument
2033 lws_dll2_foreach_safe(&wsi->ws->proxy_owner, NULL, ws_destroy_proxy_buf); in rops_destroy_role_ws()
2036 lws_free_set_NULL(wsi->ws); in rops_destroy_role_ws()
2042 rops_issue_keepalive_ws(struct lws *wsi, int isvalid) in rops_issue_keepalive_ws() argument
2047 if (lwsi_role_h2_ENCAPSULATION(wsi)) { in rops_issue_keepalive_ws()
2051 encapsulation_parent(wsi); in rops_issue_keepalive_ws()
2061 _lws_validity_confirmed_role(wsi); in rops_issue_keepalive_ws()
2064 memcpy(&wsi->ws->ping_payload_buf[LWS_PRE], &us, 8); in rops_issue_keepalive_ws()
2065 wsi->ws->send_check_ping = 1; in rops_issue_keepalive_ws()
2066 lws_callback_on_writable(wsi); in rops_issue_keepalive_ws()