From nobody Mon Feb 9 07:23:39 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1504893153814557.5537956075394; Fri, 8 Sep 2017 10:52:33 -0700 (PDT) Received: from localhost ([::1]:46742 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dqNSC-00045h-Ok for importer@patchew.org; Fri, 08 Sep 2017 13:52:32 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40089) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dqNFQ-0000KB-4I for qemu-devel@nongnu.org; Fri, 08 Sep 2017 13:39:21 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dqNFN-0008Ik-2B for qemu-devel@nongnu.org; Fri, 08 Sep 2017 13:39:20 -0400 Received: from mail-pf0-x231.google.com ([2607:f8b0:400e:c00::231]:34225) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dqNFM-0008Hw-QE for qemu-devel@nongnu.org; Fri, 08 Sep 2017 13:39:16 -0400 Received: by mail-pf0-x231.google.com with SMTP id e1so5553582pfk.1 for ; Fri, 08 Sep 2017 10:39:16 -0700 (PDT) Received: from servo.cypherpath.com (68-113-0-218.static.knwc.wa.charter.com. [68.113.0.218]) by smtp.gmail.com with ESMTPSA id c30sm4556833pgn.33.2017.09.08.10.39.14 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 08 Sep 2017 10:39:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cypherpath.com; s=google; h=mime-version:from:to:cc:subject:date:message-id:in-reply-to :references:in-reply-to:references; bh=JZZmlLubV6Q+PMzYYoDbfyYNWN1sqMop387Le6nPk50=; b=gE8+R2VTAIpw/jy7jaFSqBdUillq5RTvXt2tty+mkK3gcJcvkAYoTfRq/rsqkE/ZJY p3egMvBRgn4l6lgDNUB9TmnX/jxYwtiJsIeSSeEJUsKIs4Nb3vpc9Osj6pH+tWavQj4C SJ4yvnIu5L7qLV/5NFKbfp5hhxxTOA/sl49OI= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:to:cc:subject:date:message-id :in-reply-to:references:in-reply-to:references; bh=JZZmlLubV6Q+PMzYYoDbfyYNWN1sqMop387Le6nPk50=; b=qXj4whfcA3gd9VYlwUHxmvoBJOcKBj3EsrKyL2irpFhMDilowCmN2M+jvoA63AseIg rBbe9XDGstIllMvXUrWeiTSLoL5JJAucgiwLICQaMtiHKYC0I22/+e6frpkgvhKMaeCw sJ3s8aVuIUb6KUlFgHT4CRMdrYtWOgfQoLvP0K+QGCAkJ6i6j/C+vRXoyksswC6Ni7bz dfEZLpHuhvqSluRvTOt5GtKPEPMbB9ciNFggSIe0NawJkNvm2kWUeTQOYXg5JHAIiX80 g0f+6ZvWJoHa20SOm8kTdtXzrK8bND8Edox3ReOLkdV5jl6VSSZCvNQl7qkZ/XOM79u8 2zzg== X-Gm-Message-State: AHPjjUjO1KRYsg1MGkL3Uu9r8Q2tz9eUJYP7Isvpljwsh6RKHKhNjC6d 4KefwF7N3QhOf5Z9JAid5ZgCXUPyvsxcBfcdkS24jz/6Wi6a1hGWeZjPyyg49hsAoqzlQnvqRuH 486Li MIME-Version: 1.0 X-Google-Smtp-Source: ADKCNb4/c9QJB7U46u3oL27i2VnbXhzWBQVk5q1iP+bEFiC1HCfASc15zR/q+IGx8J6rCK/LYZfRwQ== X-Received: by 10.98.212.94 with SMTP id u30mr3954339pfl.297.1504892355637; Fri, 08 Sep 2017 10:39:15 -0700 (PDT) From: Brandon Carpenter To: qemu-devel@nongnu.org Date: Fri, 8 Sep 2017 10:37:57 -0700 Message-Id: <20170908173801.15205-3-brandon.carpenter@cypherpath.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20170908173801.15205-1-brandon.carpenter@cypherpath.com> References: <20170908173801.15205-1-brandon.carpenter@cypherpath.com> In-Reply-To: <20170724184217.21381-1-brandon.carpenter@cypherpath.com> References: <20170724184217.21381-1-brandon.carpenter@cypherpath.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400e:c00::231 Subject: [Qemu-devel] [PATCH v2 2/6] io: Small updates in preparation for websocket changes X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: brandon.carpenter@cypherpath.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Gets rid of unnecessary bit shifting and performs proper EOF checking to avoid a large number of repeated calls to recvmsg() when a client abruptly terminates a connection (bug fix). Signed-off-by: Brandon Carpenter --- io/channel-websock.c | 62 +++++++++++++++---------------------------------= ---- 1 file changed, 18 insertions(+), 44 deletions(-) diff --git a/io/channel-websock.c b/io/channel-websock.c index 5a3badbec2..185bd31be5 100644 --- a/io/channel-websock.c +++ b/io/channel-websock.c @@ -86,8 +86,6 @@ #define QIO_CHANNEL_WEBSOCK_HEADER_FIELD_OPCODE 0x0f #define QIO_CHANNEL_WEBSOCK_HEADER_FIELD_HAS_MASK 0x80 #define QIO_CHANNEL_WEBSOCK_HEADER_FIELD_PAYLOAD_LEN 0x7f -#define QIO_CHANNEL_WEBSOCK_HEADER_SHIFT_FIN 7 -#define QIO_CHANNEL_WEBSOCK_HEADER_SHIFT_HAS_MASK 7 =20 typedef struct QIOChannelWebsockHeader QIOChannelWebsockHeader; =20 @@ -492,7 +490,7 @@ static void qio_channel_websock_encode(QIOChannelWebsoc= k *ioc) return; } =20 - header.ws.b0 =3D (1 << QIO_CHANNEL_WEBSOCK_HEADER_SHIFT_FIN) | + header.ws.b0 =3D QIO_CHANNEL_WEBSOCK_HEADER_FIELD_FIN | (QIO_CHANNEL_WEBSOCK_OPCODE_BINARY_FRAME & QIO_CHANNEL_WEBSOCK_HEADER_FIELD_OPCODE); if (ioc->rawoutput.offset < @@ -519,8 +517,8 @@ static void qio_channel_websock_encode(QIOChannelWebsoc= k *ioc) } =20 =20 -static ssize_t qio_channel_websock_decode_header(QIOChannelWebsock *ioc, - Error **errp) +static int qio_channel_websock_decode_header(QIOChannelWebsock *ioc, + Error **errp) { unsigned char opcode, fin, has_mask; size_t header_size; @@ -539,11 +537,9 @@ static ssize_t qio_channel_websock_decode_header(QIOCh= annelWebsock *ioc, return QIO_CHANNEL_ERR_BLOCK; } =20 - fin =3D (header->b0 & QIO_CHANNEL_WEBSOCK_HEADER_FIELD_FIN) >> - QIO_CHANNEL_WEBSOCK_HEADER_SHIFT_FIN; + fin =3D header->b0 & QIO_CHANNEL_WEBSOCK_HEADER_FIELD_FIN; opcode =3D header->b0 & QIO_CHANNEL_WEBSOCK_HEADER_FIELD_OPCODE; - has_mask =3D (header->b1 & QIO_CHANNEL_WEBSOCK_HEADER_FIELD_HAS_MASK) = >> - QIO_CHANNEL_WEBSOCK_HEADER_SHIFT_HAS_MASK; + has_mask =3D header->b1 & QIO_CHANNEL_WEBSOCK_HEADER_FIELD_HAS_MASK; payload_len =3D header->b1 & QIO_CHANNEL_WEBSOCK_HEADER_FIELD_PAYLOAD_= LEN; =20 if (opcode =3D=3D QIO_CHANNEL_WEBSOCK_OPCODE_CLOSE) { @@ -561,7 +557,7 @@ static ssize_t qio_channel_websock_decode_header(QIOCha= nnelWebsock *ioc, return -1; } if (!has_mask) { - error_setg(errp, "websocket frames must be masked"); + error_setg(errp, "client websocket frames must be masked"); return -1; } if (opcode !=3D QIO_CHANNEL_WEBSOCK_OPCODE_BINARY_FRAME) { @@ -593,8 +589,8 @@ static ssize_t qio_channel_websock_decode_header(QIOCha= nnelWebsock *ioc, } =20 =20 -static ssize_t qio_channel_websock_decode_payload(QIOChannelWebsock *ioc, - Error **errp) +static int qio_channel_websock_decode_payload(QIOChannelWebsock *ioc, + Error **errp) { size_t i; size_t payload_len; @@ -635,7 +631,7 @@ static ssize_t qio_channel_websock_decode_payload(QIOCh= annelWebsock *ioc, buffer_reserve(&ioc->rawinput, payload_len); buffer_append(&ioc->rawinput, ioc->encinput.buffer, payload_len); buffer_advance(&ioc->encinput, payload_len); - return payload_len; + return 0; } =20 =20 @@ -715,8 +711,8 @@ static ssize_t qio_channel_websock_read_wire(QIOChannel= Websock *ioc, if (ret < 0) { return ret; } - if (ret =3D=3D 0 && - ioc->encinput.offset =3D=3D 0) { + if (ret =3D=3D 0 && ioc->encinput.offset =3D=3D 0) { + ioc->io_eof =3D TRUE; return 0; } ioc->encinput.offset +=3D ret; @@ -728,10 +724,6 @@ static ssize_t qio_channel_websock_read_wire(QIOChanne= lWebsock *ioc, if (ret < 0) { return ret; } - if (ret =3D=3D 0) { - ioc->io_eof =3D TRUE; - break; - } } =20 ret =3D qio_channel_websock_decode_payload(ioc, errp); @@ -996,14 +988,12 @@ struct QIOChannelWebsockSource { }; =20 static gboolean -qio_channel_websock_source_prepare(GSource *source, - gint *timeout) +qio_channel_websock_source_check(GSource *source) { QIOChannelWebsockSource *wsource =3D (QIOChannelWebsockSource *)source; GIOCondition cond =3D 0; - *timeout =3D -1; =20 - if (wsource->wioc->rawinput.offset) { + if (wsource->wioc->rawinput.offset || wsource->wioc->io_eof) { cond |=3D G_IO_IN; } if (wsource->wioc->rawoutput.offset < QIO_CHANNEL_WEBSOCK_MAX_BUFFER) { @@ -1014,19 +1004,11 @@ qio_channel_websock_source_prepare(GSource *source, } =20 static gboolean -qio_channel_websock_source_check(GSource *source) +qio_channel_websock_source_prepare(GSource *source, + gint *timeout) { - QIOChannelWebsockSource *wsource =3D (QIOChannelWebsockSource *)source; - GIOCondition cond =3D 0; - - if (wsource->wioc->rawinput.offset) { - cond |=3D G_IO_IN; - } - if (wsource->wioc->rawoutput.offset < QIO_CHANNEL_WEBSOCK_MAX_BUFFER) { - cond |=3D G_IO_OUT; - } - - return cond & wsource->condition; + *timeout =3D -1; + return qio_channel_websock_source_check(source); } =20 static gboolean @@ -1036,17 +1018,9 @@ qio_channel_websock_source_dispatch(GSource *source, { QIOChannelFunc func =3D (QIOChannelFunc)callback; QIOChannelWebsockSource *wsource =3D (QIOChannelWebsockSource *)source; - GIOCondition cond =3D 0; - - if (wsource->wioc->rawinput.offset) { - cond |=3D G_IO_IN; - } - if (wsource->wioc->rawoutput.offset < QIO_CHANNEL_WEBSOCK_MAX_BUFFER) { - cond |=3D G_IO_OUT; - } =20 return (*func)(QIO_CHANNEL(wsource->wioc), - (cond & wsource->condition), + qio_channel_websock_source_check(source), user_data); } =20 --=20 2.14.1 --=20 CONFIDENTIALITY NOTICE: This e-mail message, including any attachments, is=20 for the sole use of the intended recipient(s) and may contain proprietary,=20 confidential or privileged information or otherwise be protected by law.=20 Any unauthorized review, use, disclosure or distribution is prohibited. If=20 you are not the intended recipient, please notify the sender and destroy=20 all copies and the original message.