Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/811757/?format=api
{ "id": 811757, "url": "http://patchwork.ozlabs.org/api/patches/811757/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20170908173801.15205-3-brandon.carpenter@cypherpath.com/", "project": { "id": 14, "url": "http://patchwork.ozlabs.org/api/projects/14/?format=api", "name": "QEMU Development", "link_name": "qemu-devel", "list_id": "qemu-devel.nongnu.org", "list_email": "qemu-devel@nongnu.org", "web_url": "", "scm_url": "", "webscm_url": "", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20170908173801.15205-3-brandon.carpenter@cypherpath.com>", "list_archive_url": null, "date": "2017-09-08T17:37:57", "name": "[v2,2/6] io: Small updates in preparation for websocket changes", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "91d9149651f2706f2600151abe9e692dc54c208f", "submitter": { "id": 72031, "url": "http://patchwork.ozlabs.org/api/people/72031/?format=api", "name": "Brandon Carpenter", "email": "brandon.carpenter@cypherpath.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20170908173801.15205-3-brandon.carpenter@cypherpath.com/mbox/", "series": [ { "id": 2262, "url": "http://patchwork.ozlabs.org/api/series/2262/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=2262", "date": "2017-09-08T17:37:56", "name": "Update websocket code to more fully support the RFC", "version": 2, "mbox": "http://patchwork.ozlabs.org/series/2262/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/811757/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/811757/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": "patchwork-incoming@bilbo.ozlabs.org", "Authentication-Results": [ "ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=nongnu.org\n\t(client-ip=2001:4830:134:3::11; helo=lists.gnu.org;\n\tenvelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n\treceiver=<UNKNOWN>)", "ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=cypherpath.com header.i=@cypherpath.com\n\theader.b=\"gE8+R2VT\"; dkim-atps=neutral" ], "Received": [ "from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11])\n\t(using TLSv1 with cipher AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xplHq282Yz9s8J\n\tfor <incoming@patchwork.ozlabs.org>;\n\tSat, 9 Sep 2017 03:51:35 +1000 (AEST)", "from localhost ([::1]:46739 helo=lists.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.71) (envelope-from\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>)\n\tid 1dqNRF-00030c-Cb\n\tfor incoming@patchwork.ozlabs.org; Fri, 08 Sep 2017 13:51:33 -0400", "from eggs.gnu.org ([2001:4830:134:3::10]:40089)\n\tby lists.gnu.org with esmtp (Exim 4.71)\n\t(envelope-from <brandon.carpenter@cypherpath.com>)\n\tid 1dqNFQ-0000KB-4I\n\tfor qemu-devel@nongnu.org; Fri, 08 Sep 2017 13:39:21 -0400", "from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)\n\t(envelope-from <brandon.carpenter@cypherpath.com>)\n\tid 1dqNFN-0008Ik-2B\n\tfor qemu-devel@nongnu.org; Fri, 08 Sep 2017 13:39:20 -0400", "from mail-pf0-x231.google.com ([2607:f8b0:400e:c00::231]:34225)\n\tby eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16)\n\t(Exim 4.71) (envelope-from <brandon.carpenter@cypherpath.com>)\n\tid 1dqNFM-0008Hw-QE\n\tfor qemu-devel@nongnu.org; Fri, 08 Sep 2017 13:39:16 -0400", "by mail-pf0-x231.google.com with SMTP id e1so5553582pfk.1\n\tfor <qemu-devel@nongnu.org>; Fri, 08 Sep 2017 10:39:16 -0700 (PDT)", "from servo.cypherpath.com (68-113-0-218.static.knwc.wa.charter.com.\n\t[68.113.0.218]) by smtp.gmail.com with ESMTPSA id\n\tc30sm4556833pgn.33.2017.09.08.10.39.14\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tFri, 08 Sep 2017 10:39:15 -0700 (PDT)" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=cypherpath.com; s=google;\n\th=mime-version:from:to:cc:subject:date:message-id:in-reply-to\n\t:references:in-reply-to:references;\n\tbh=JZZmlLubV6Q+PMzYYoDbfyYNWN1sqMop387Le6nPk50=;\n\tb=gE8+R2VTAIpw/jy7jaFSqBdUillq5RTvXt2tty+mkK3gcJcvkAYoTfRq/rsqkE/ZJY\n\tp3egMvBRgn4l6lgDNUB9TmnX/jxYwtiJsIeSSeEJUsKIs4Nb3vpc9Osj6pH+tWavQj4C\n\tSJ4yvnIu5L7qLV/5NFKbfp5hhxxTOA/sl49OI=", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:mime-version:from:to:cc:subject:date:message-id\n\t:in-reply-to:references:in-reply-to:references;\n\tbh=JZZmlLubV6Q+PMzYYoDbfyYNWN1sqMop387Le6nPk50=;\n\tb=qXj4whfcA3gd9VYlwUHxmvoBJOcKBj3EsrKyL2irpFhMDilowCmN2M+jvoA63AseIg\n\trBbe9XDGstIllMvXUrWeiTSLoL5JJAucgiwLICQaMtiHKYC0I22/+e6frpkgvhKMaeCw\n\tsJ3s8aVuIUb6KUlFgHT4CRMdrYtWOgfQoLvP0K+QGCAkJ6i6j/C+vRXoyksswC6Ni7bz\n\tdfEZLpHuhvqSluRvTOt5GtKPEPMbB9ciNFggSIe0NawJkNvm2kWUeTQOYXg5JHAIiX80\n\tg0f+6ZvWJoHa20SOm8kTdtXzrK8bND8Edox3ReOLkdV5jl6VSSZCvNQl7qkZ/XOM79u8\n\t2zzg==", "X-Gm-Message-State": "AHPjjUjO1KRYsg1MGkL3Uu9r8Q2tz9eUJYP7Isvpljwsh6RKHKhNjC6d\n\t4KefwF7N3QhOf5Z9JAid5ZgCXUPyvsxcBfcdkS24jz/6Wi6a1hGWeZjPyyg49hsAoqzlQnvqRuH\n\t486Li", "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; \n\tFri, 08 Sep 2017 10:39:15 -0700 (PDT)", "From": "Brandon Carpenter <brandon.carpenter@cypherpath.com>", "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>", "<20170724184217.21381-1-brandon.carpenter@cypherpath.com>" ], "References": [ "<20170908173801.15205-1-brandon.carpenter@cypherpath.com>", "<20170724184217.21381-1-brandon.carpenter@cypherpath.com>" ], "Content-Type": "text/plain; charset=\"US-ASCII\"", "X-detected-operating-system": "by eggs.gnu.org: Genre and OS details not\n\trecognized.", "X-Received-From": "2607:f8b0:400e:c00::231", "Subject": "[Qemu-devel] [PATCH v2 2/6] io: Small updates in preparation for\n\twebsocket changes", "X-BeenThere": "qemu-devel@nongnu.org", "X-Mailman-Version": "2.1.21", "Precedence": "list", "List-Id": "<qemu-devel.nongnu.org>", "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>", "List-Archive": "<http://lists.nongnu.org/archive/html/qemu-devel/>", "List-Post": "<mailto:qemu-devel@nongnu.org>", "List-Help": "<mailto:qemu-devel-request@nongnu.org?subject=help>", "List-Subscribe": "<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=subscribe>", "Cc": "brandon.carpenter@cypherpath.com", "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org", "Sender": "\"Qemu-devel\"\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>" }, "content": "Gets rid of unnecessary bit shifting and performs proper EOF checking to\navoid a large number of repeated calls to recvmsg() when a client\nabruptly terminates a connection (bug fix).\n\nSigned-off-by: Brandon Carpenter <brandon.carpenter@cypherpath.com>\n---\n io/channel-websock.c | 62 +++++++++++++++-------------------------------------\n 1 file changed, 18 insertions(+), 44 deletions(-)", "diff": "diff --git a/io/channel-websock.c b/io/channel-websock.c\nindex 5a3badbec2..185bd31be5 100644\n--- a/io/channel-websock.c\n+++ b/io/channel-websock.c\n@@ -86,8 +86,6 @@\n #define QIO_CHANNEL_WEBSOCK_HEADER_FIELD_OPCODE 0x0f\n #define QIO_CHANNEL_WEBSOCK_HEADER_FIELD_HAS_MASK 0x80\n #define QIO_CHANNEL_WEBSOCK_HEADER_FIELD_PAYLOAD_LEN 0x7f\n-#define QIO_CHANNEL_WEBSOCK_HEADER_SHIFT_FIN 7\n-#define QIO_CHANNEL_WEBSOCK_HEADER_SHIFT_HAS_MASK 7\n \n typedef struct QIOChannelWebsockHeader QIOChannelWebsockHeader;\n \n@@ -492,7 +490,7 @@ static void qio_channel_websock_encode(QIOChannelWebsock *ioc)\n return;\n }\n \n- header.ws.b0 = (1 << QIO_CHANNEL_WEBSOCK_HEADER_SHIFT_FIN) |\n+ header.ws.b0 = QIO_CHANNEL_WEBSOCK_HEADER_FIELD_FIN |\n (QIO_CHANNEL_WEBSOCK_OPCODE_BINARY_FRAME &\n QIO_CHANNEL_WEBSOCK_HEADER_FIELD_OPCODE);\n if (ioc->rawoutput.offset <\n@@ -519,8 +517,8 @@ static void qio_channel_websock_encode(QIOChannelWebsock *ioc)\n }\n \n \n-static ssize_t qio_channel_websock_decode_header(QIOChannelWebsock *ioc,\n- Error **errp)\n+static int qio_channel_websock_decode_header(QIOChannelWebsock *ioc,\n+ Error **errp)\n {\n unsigned char opcode, fin, has_mask;\n size_t header_size;\n@@ -539,11 +537,9 @@ static ssize_t qio_channel_websock_decode_header(QIOChannelWebsock *ioc,\n return QIO_CHANNEL_ERR_BLOCK;\n }\n \n- fin = (header->b0 & QIO_CHANNEL_WEBSOCK_HEADER_FIELD_FIN) >>\n- QIO_CHANNEL_WEBSOCK_HEADER_SHIFT_FIN;\n+ fin = header->b0 & QIO_CHANNEL_WEBSOCK_HEADER_FIELD_FIN;\n opcode = header->b0 & QIO_CHANNEL_WEBSOCK_HEADER_FIELD_OPCODE;\n- has_mask = (header->b1 & QIO_CHANNEL_WEBSOCK_HEADER_FIELD_HAS_MASK) >>\n- QIO_CHANNEL_WEBSOCK_HEADER_SHIFT_HAS_MASK;\n+ has_mask = header->b1 & QIO_CHANNEL_WEBSOCK_HEADER_FIELD_HAS_MASK;\n payload_len = header->b1 & QIO_CHANNEL_WEBSOCK_HEADER_FIELD_PAYLOAD_LEN;\n \n if (opcode == QIO_CHANNEL_WEBSOCK_OPCODE_CLOSE) {\n@@ -561,7 +557,7 @@ static ssize_t qio_channel_websock_decode_header(QIOChannelWebsock *ioc,\n return -1;\n }\n if (!has_mask) {\n- error_setg(errp, \"websocket frames must be masked\");\n+ error_setg(errp, \"client websocket frames must be masked\");\n return -1;\n }\n if (opcode != QIO_CHANNEL_WEBSOCK_OPCODE_BINARY_FRAME) {\n@@ -593,8 +589,8 @@ static ssize_t qio_channel_websock_decode_header(QIOChannelWebsock *ioc,\n }\n \n \n-static ssize_t qio_channel_websock_decode_payload(QIOChannelWebsock *ioc,\n- Error **errp)\n+static int qio_channel_websock_decode_payload(QIOChannelWebsock *ioc,\n+ Error **errp)\n {\n size_t i;\n size_t payload_len;\n@@ -635,7 +631,7 @@ static ssize_t qio_channel_websock_decode_payload(QIOChannelWebsock *ioc,\n buffer_reserve(&ioc->rawinput, payload_len);\n buffer_append(&ioc->rawinput, ioc->encinput.buffer, payload_len);\n buffer_advance(&ioc->encinput, payload_len);\n- return payload_len;\n+ return 0;\n }\n \n \n@@ -715,8 +711,8 @@ static ssize_t qio_channel_websock_read_wire(QIOChannelWebsock *ioc,\n if (ret < 0) {\n return ret;\n }\n- if (ret == 0 &&\n- ioc->encinput.offset == 0) {\n+ if (ret == 0 && ioc->encinput.offset == 0) {\n+ ioc->io_eof = TRUE;\n return 0;\n }\n ioc->encinput.offset += ret;\n@@ -728,10 +724,6 @@ static ssize_t qio_channel_websock_read_wire(QIOChannelWebsock *ioc,\n if (ret < 0) {\n return ret;\n }\n- if (ret == 0) {\n- ioc->io_eof = TRUE;\n- break;\n- }\n }\n \n ret = qio_channel_websock_decode_payload(ioc, errp);\n@@ -996,14 +988,12 @@ struct QIOChannelWebsockSource {\n };\n \n static gboolean\n-qio_channel_websock_source_prepare(GSource *source,\n- gint *timeout)\n+qio_channel_websock_source_check(GSource *source)\n {\n QIOChannelWebsockSource *wsource = (QIOChannelWebsockSource *)source;\n GIOCondition cond = 0;\n- *timeout = -1;\n \n- if (wsource->wioc->rawinput.offset) {\n+ if (wsource->wioc->rawinput.offset || wsource->wioc->io_eof) {\n cond |= G_IO_IN;\n }\n if (wsource->wioc->rawoutput.offset < QIO_CHANNEL_WEBSOCK_MAX_BUFFER) {\n@@ -1014,19 +1004,11 @@ qio_channel_websock_source_prepare(GSource *source,\n }\n \n static gboolean\n-qio_channel_websock_source_check(GSource *source)\n+qio_channel_websock_source_prepare(GSource *source,\n+ gint *timeout)\n {\n- QIOChannelWebsockSource *wsource = (QIOChannelWebsockSource *)source;\n- GIOCondition cond = 0;\n-\n- if (wsource->wioc->rawinput.offset) {\n- cond |= G_IO_IN;\n- }\n- if (wsource->wioc->rawoutput.offset < QIO_CHANNEL_WEBSOCK_MAX_BUFFER) {\n- cond |= G_IO_OUT;\n- }\n-\n- return cond & wsource->condition;\n+ *timeout = -1;\n+ return qio_channel_websock_source_check(source);\n }\n \n static gboolean\n@@ -1036,17 +1018,9 @@ qio_channel_websock_source_dispatch(GSource *source,\n {\n QIOChannelFunc func = (QIOChannelFunc)callback;\n QIOChannelWebsockSource *wsource = (QIOChannelWebsockSource *)source;\n- GIOCondition cond = 0;\n-\n- if (wsource->wioc->rawinput.offset) {\n- cond |= G_IO_IN;\n- }\n- if (wsource->wioc->rawoutput.offset < QIO_CHANNEL_WEBSOCK_MAX_BUFFER) {\n- cond |= G_IO_OUT;\n- }\n \n return (*func)(QIO_CHANNEL(wsource->wioc),\n- (cond & wsource->condition),\n+ qio_channel_websock_source_check(source),\n user_data);\n }\n \n", "prefixes": [ "v2", "2/6" ] }