Lines Matching refs:wsi

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