Lines Matching refs:wsi
32 int lws_ws_client_rx_sm(struct lws *wsi, unsigned char c)
49 if (wsi->ws->rx_draining_ext) {
52 lws_remove_wsi_from_draining_ext_list(wsi);
54 lwsl_wsi_debug(wsi, "doing draining flow");
60 switch (wsi->lws_rx_parse_state) {
63 wsi->ws->defeat_check_utf8 = 0;
65 switch (wsi->ws->ietf_spec_revision) {
67 wsi->ws->opcode = c & 0xf;
69 switch (wsi->ws->opcode) {
71 wsi->ws->rsv_first_msg = (c & 0x70);
78 wsi->ws->pmd_trailer_application = !!(c & 0x40);
80 wsi->ws->continuation_possible = 1;
81 wsi->ws->check_utf8 = lws_check_opt(
82 wsi->a.context->options,
84 wsi->ws->utf8 = 0;
85 wsi->ws->first_fragment = 1;
88 wsi->ws->rsv_first_msg = (c & 0x70);
95 wsi->ws->pmd_trailer_application = !!(c & 0x40);
97 wsi->ws->check_utf8 = 0;
98 wsi->ws->continuation_possible = 1;
99 wsi->ws->first_fragment = 1;
102 if (!wsi->ws->continuation_possible) {
103 lwsl_wsi_info(wsi, "disordered continuation");
106 wsi->ws->first_fragment = 0;
109 wsi->ws->check_utf8 = 0;
110 wsi->ws->utf8 = 0;
122 lwsl_wsi_info(wsi, "illegal opcode");
125 wsi->ws->defeat_check_utf8 = 1;
128 wsi->ws->rsv = (c & 0x70);
132 !wsi->ws->count_act_ext &&
134 wsi->ws->rsv) {
135 lwsl_wsi_info(wsi, "illegal rsv bits set");
138 wsi->ws->final = !!((c >> 7) & 1);
139 lwsl_wsi_ext(wsi, " This RX frame Final %d",
140 wsi->ws->final);
142 if (wsi->ws->owed_a_fin &&
143 (wsi->ws->opcode == LWSWSOPC_TEXT_FRAME ||
144 wsi->ws->opcode == LWSWSOPC_BINARY_FRAME)) {
145 lwsl_wsi_info(wsi, "hey you owed us a FIN");
148 if ((!(wsi->ws->opcode & 8)) && wsi->ws->final) {
149 wsi->ws->continuation_possible = 0;
150 wsi->ws->owed_a_fin = 0;
153 if ((wsi->ws->opcode & 8) && !wsi->ws->final) {
154 lwsl_wsi_info(wsi, "control msg can't be fragmented");
157 if (!wsi->ws->final)
158 wsi->ws->owed_a_fin = 1;
160 switch (wsi->ws->opcode) {
163 wsi->ws->frame_is_binary = wsi->ws->opcode ==
167 wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN;
171 lwsl_wsi_err(wsi, "unknown spec version %02d",
172 wsi->ws->ietf_spec_revision);
179 wsi->ws->this_frame_masked = !!(c & 0x80);
180 if (wsi->ws->this_frame_masked)
186 if (wsi->ws->opcode & 8)
188 wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN16_2;
192 if (wsi->ws->opcode & 8)
194 wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN64_8;
197 wsi->ws->rx_packet_length = c & 0x7f;
198 if (wsi->ws->this_frame_masked)
199 wsi->lws_rx_parse_state =
202 if (wsi->ws->rx_packet_length) {
203 wsi->lws_rx_parse_state =
206 wsi->lws_rx_parse_state = LWS_RXPS_NEW;
215 wsi->ws->rx_packet_length = (size_t)((unsigned int)c << 8);
216 wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN16_1;
220 wsi->ws->rx_packet_length |= c;
221 if (wsi->ws->this_frame_masked)
222 wsi->lws_rx_parse_state = LWS_RXPS_07_COLLECT_FRAME_KEY_1;
224 if (wsi->ws->rx_packet_length)
225 wsi->lws_rx_parse_state =
228 wsi->lws_rx_parse_state = LWS_RXPS_NEW;
236 lwsl_wsi_warn(wsi, "b63 of length must be zero");
241 wsi->ws->rx_packet_length = ((size_t)c) << 56;
243 wsi->ws->rx_packet_length = 0;
245 wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN64_7;
250 wsi->ws->rx_packet_length |= ((size_t)c) << 48;
252 wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN64_6;
257 wsi->ws->rx_packet_length |= ((size_t)c) << 40;
259 wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN64_5;
264 wsi->ws->rx_packet_length |= ((size_t)c) << 32;
266 wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN64_4;
270 wsi->ws->rx_packet_length |= ((size_t)c) << 24;
271 wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN64_3;
275 wsi->ws->rx_packet_length |= ((size_t)c) << 16;
276 wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN64_2;
280 wsi->ws->rx_packet_length |= ((size_t)c) << 8;
281 wsi->lws_rx_parse_state = LWS_RXPS_04_FRAME_HDR_LEN64_1;
285 wsi->ws->rx_packet_length |= (size_t)c;
286 if (wsi->ws->this_frame_masked)
287 wsi->lws_rx_parse_state =
290 if (wsi->ws->rx_packet_length)
291 wsi->lws_rx_parse_state =
294 wsi->lws_rx_parse_state = LWS_RXPS_NEW;
301 wsi->ws->mask[0] = c;
303 wsi->ws->all_zero_nonce = 0;
304 wsi->lws_rx_parse_state = LWS_RXPS_07_COLLECT_FRAME_KEY_2;
308 wsi->ws->mask[1] = c;
310 wsi->ws->all_zero_nonce = 0;
311 wsi->lws_rx_parse_state = LWS_RXPS_07_COLLECT_FRAME_KEY_3;
315 wsi->ws->mask[2] = c;
317 wsi->ws->all_zero_nonce = 0;
318 wsi->lws_rx_parse_state = LWS_RXPS_07_COLLECT_FRAME_KEY_4;
322 wsi->ws->mask[3] = c;
324 wsi->ws->all_zero_nonce = 0;
326 if (wsi->ws->rx_packet_length)
327 wsi->lws_rx_parse_state =
330 wsi->lws_rx_parse_state = LWS_RXPS_NEW;
337 assert(wsi->ws->rx_ubuf);
339 if (wsi->ws->rx_draining_ext)
342 if (wsi->ws->this_frame_masked && !wsi->ws->all_zero_nonce)
343 c ^= wsi->ws->mask[(wsi->ws->mask_idx++) & 3];
350 wsi->ws->rx_ubuf[LWS_PRE + (wsi->ws->rx_ubuf_head++)] = c;
352 if (--wsi->ws->rx_packet_length == 0) {
354 wsi->lws_rx_parse_state = LWS_RXPS_NEW;
355 lwsl_wsi_debug(wsi, "spilling as we have the whole frame");
363 if (!wsi->a.protocol->rx_buffer_size &&
364 wsi->ws->rx_ubuf_head != wsi->a.context->pt_serv_buf_size)
367 if (wsi->a.protocol->rx_buffer_size &&
368 wsi->ws->rx_ubuf_head != wsi->a.protocol->rx_buffer_size)
373 lwsl_wsi_debug(wsi, "spilling as we filled our rx buffer");
383 switch (wsi->ws->opcode) {
385 pp = &wsi->ws->rx_ubuf[LWS_PRE];
386 if (lws_check_opt(wsi->a.context->options,
388 wsi->ws->rx_ubuf_head > 2 &&
389 lws_check_utf8(&wsi->ws->utf8, pp + 2,
390 wsi->ws->rx_ubuf_head - 2))
394 if (lwsi_state(wsi) == LRS_AWAITING_CLOSE_ACK) {
399 lwsl_wsi_parser(wsi, "seen server's close ack");
403 lwsl_wsi_parser(wsi, "client sees server close len = %d",
404 (int)wsi->ws->rx_ubuf_head);
405 if (wsi->ws->rx_ubuf_head >= 2) {
418 wsi->a.protocol->callback, wsi,
420 wsi->user_space, pp,
421 wsi->ws->rx_ubuf_head))
424 memcpy(wsi->ws->ping_payload_buf + LWS_PRE, pp,
425 wsi->ws->rx_ubuf_head);
426 wsi->ws->close_in_ping_buffer_len =
427 (uint8_t)wsi->ws->rx_ubuf_head;
429 lwsl_wsi_info(wsi, "scheduling return close as ack");
430 __lws_change_pollfd(wsi, LWS_POLLIN, 0);
431 lws_set_timeout(wsi, PENDING_TIMEOUT_CLOSE_SEND, 3);
432 wsi->waiting_to_send_close_frame = 1;
433 wsi->close_needs_ack = 0;
434 lwsi_set_state(wsi, LRS_WAITING_TO_SEND_CLOSE);
435 lws_callback_on_writable(wsi);
440 lwsl_wsi_info(wsi, "received %d byte ping, sending pong",
441 (int)wsi->ws->rx_ubuf_head);
444 if (wsi->ws->close_in_ping_buffer_len)
447 if (wsi->ws->pong_pending_flag) {
452 lwsl_wsi_parser(wsi, "DROP PING since one pending");
457 if (wsi->ws->rx_ubuf_head > 128 - 3) {
458 lwsl_wsi_parser(wsi, "DROP PING payload too large");
463 memcpy(wsi->ws->pong_payload_buf + LWS_PRE,
464 &wsi->ws->rx_ubuf[LWS_PRE],
465 wsi->ws->rx_ubuf_head);
467 wsi->ws->pong_payload_len = (uint8_t)wsi->ws->rx_ubuf_head;
468 wsi->ws->pong_pending_flag = 1;
471 lws_callback_on_writable(wsi);
473 wsi->ws->rx_ubuf_head = 0;
478 lwsl_wsi_info(wsi, "Received pong");
479 lwsl_hexdump_wsi_debug(wsi, &wsi->ws->rx_ubuf[LWS_PRE],
480 wsi->ws->rx_ubuf_head);
482 lws_validity_confirmed(wsi);
494 lwsl_wsi_ext(wsi, "Unhandled ext opc 0x%x", wsi->ws->opcode);
495 wsi->ws->rx_ubuf_head = 0;
517 pmdrx.eb_in.token = &wsi->ws->rx_ubuf[LWS_PRE];
518 pmdrx.eb_in.len = (int)wsi->ws->rx_ubuf_head;
524 lwsl_wsi_debug(wsi, "starting disbursal of %d deframed rx",
525 (int)wsi->ws->rx_ubuf_head);
538 lwsl_wsi_ext(wsi, "+++ passing %d %p to ext",
541 n = lws_ext_cb_active(wsi, LWS_EXT_CB_PAYLOAD_RX,
543 lwsl_wsi_ext(wsi, "Ext RX returned %d", n);
545 wsi->socket_is_permanently_unusable = 1;
552 lwsl_wsi_ext(wsi, "post inflate ebuf in len %d / out len %d",
557 lwsl_wsi_debug(wsi, " --- ending drain on 0 read result");
563 lwsl_wsi_ext(wsi, "adding to draining ext list");
564 lws_add_wsi_to_draining_ext_list(wsi);
566 lwsl_wsi_ext(wsi, "removing from draining ext list");
567 lws_remove_wsi_from_draining_ext_list(wsi);
569 rx_draining_ext = wsi->ws->rx_draining_ext;
572 if (wsi->ws->check_utf8 && !wsi->ws->defeat_check_utf8) {
574 if (lws_check_utf8(&wsi->ws->utf8,
577 lws_close_reason(wsi,
584 if (!wsi->ws->rx_packet_length &&
585 wsi->ws->final && wsi->ws->utf8
591 lwsl_wsi_info(wsi, "FINAL utf8 error");
592 lws_close_reason(wsi,
596 lwsl_wsi_info(wsi, "utf8 error");
597 lwsl_hexdump_wsi_info(wsi, pmdrx.eb_out.token,
613 if (!wsi->a.protocol->callback)
617 lwsl_wsi_info(wsi, "Client doing pong callback");
626 lws_add_wsi_to_draining_ext_list(wsi);
628 lws_remove_wsi_from_draining_ext_list(wsi);
631 if (lwsi_state(wsi) == LRS_RETURNED_CLOSE ||
632 lwsi_state(wsi) == LRS_WAITING_TO_SEND_CLOSE ||
633 lwsi_state(wsi) == LRS_AWAITING_CLOSE_ACK)
646 m = wsi->a.protocol->callback(wsi,
648 wsi->user_space, pmdrx.eb_out.token,
651 wsi->ws->first_fragment = 0;
653 lwsl_wsi_debug(wsi, "bulk ws rx: inp used %d, output %d",
654 (int)wsi->ws->rx_ubuf_head,
668 wsi->ws->rx_ubuf_head = 0;
671 lwsl_wsi_err(wsi, "client rx illegal state");
678 lwsl_wsi_warn(wsi, "Control frame asking for extended length is illegal");
684 lws_close_reason(wsi,
688 lwsl_wsi_warn(wsi, "Server must not mask");