Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp3380689pxb; Sun, 7 Feb 2021 07:23:50 -0800 (PST) X-Google-Smtp-Source: ABdhPJzKWm1VR9V9KHXdgQi7530wPPDigOVXWQ4c7Rict77Isfz/sJ70unc2NSUbaRCON1a+4g8d X-Received: by 2002:a05:6402:2690:: with SMTP id w16mr13200140edd.304.1612711430009; Sun, 07 Feb 2021 07:23:50 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1612711430; cv=none; d=google.com; s=arc-20160816; b=n2SJv2JQNJwHJmTQFcAiD0xYmP4zNjxTMOb2DKEszSUGMmzIBZbaoDmkgcpL6ggoM/ KEQPLDCWaHVG2EIO/TiHtep6IHhErPKNBQp6lc2soN8ZrarSzIAAg9zLhTgc/iWBgysO 3cCCsa2hW7VTZDAAew+qZIZsfdAOBLnw31KDMgDhAyobddTnboBEENmKzr0pMXPbwYk6 NJWPbgw+MxLx1Hs6CiDUAhIIRjpLPTlJdhXiQxloUjTKAkLsoyxuWdDMWVGfNRMpGBCd MtAS+h5EjggFtTrdrZ+3nszUx5paec/6+w78sH5xbHEz7UiOO8cuJigBkf5zuWJEUCxB hf6Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=pjp/ZceS3DC//GgGJrNgEBJqVKqPNb2YSxXQuntoDLY=; b=uw59U9EjLHK64oyXxLwU9FYy7R/lG2ueVLBpPbugY3853pqxr9Drm4Rk7r9b8P3Zcb sJ4xM9pFHKMXrLWh68bBDwteeoDpn02V0+92miVADuNHBakj3I4iMyvzpZr/WmsXCx7O p9BtC1boG2bSSWQPyrUzwpfYgT04XhIQl5pHOageXjD1Ep6FCGXDI0Wimmfe6b3RF9BY kkAMEuMemH1O0MKAnsH92oiR8XhJH+UxRAMZ8A8TX2ZU/N3KR+lNqdX3eNWUbkjAFMAc LPB4hy0OHbDF7ITCuhQeC+djZOI6rJVphEC4/kXjqxYZBKeu/qRCNn9rd2hrU7sZCcMf ePeA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kaspersky.com header.s=mail header.b="K/iF4xE1"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=kaspersky.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id p18si8935848ejg.277.2021.02.07.07.23.25; Sun, 07 Feb 2021 07:23:49 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kaspersky.com header.s=mail header.b="K/iF4xE1"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=kaspersky.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230127AbhBGPVG (ORCPT + 99 others); Sun, 7 Feb 2021 10:21:06 -0500 Received: from mx12.kaspersky-labs.com ([91.103.66.155]:13455 "EHLO mx12.kaspersky-labs.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230046AbhBGPSb (ORCPT ); Sun, 7 Feb 2021 10:18:31 -0500 Received: from relay12.kaspersky-labs.com (unknown [127.0.0.10]) by relay12.kaspersky-labs.com (Postfix) with ESMTP id A85FF75EE5; Sun, 7 Feb 2021 18:17:39 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kaspersky.com; s=mail; t=1612711059; bh=pjp/ZceS3DC//GgGJrNgEBJqVKqPNb2YSxXQuntoDLY=; h=From:To:Subject:Date:Message-ID:MIME-Version:Content-Type; b=K/iF4xE1gjvEs3RcfmbIWx4rL1fWEQnAriNVXUK9EmfyTbQKlMo4M9MehQbK/6ooR 0aZnMe2sx+3HhJia7CqepuvH9QTbcrBTfLG7rMzeKhd+RKdj+3+ZG4ajjs+ur9R5DV fD1SfwQ30tnva4y6rOoU6jRevX27r0jFuctmsy0A= Received: from mail-hq2.kaspersky.com (unknown [91.103.66.206]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (Client CN "mail-hq2.kaspersky.com", Issuer "Kaspersky MailRelays CA G3" (verified OK)) by mailhub12.kaspersky-labs.com (Postfix) with ESMTPS id 4785675BDD; Sun, 7 Feb 2021 18:17:39 +0300 (MSK) Received: from arseniy-pc.avp.ru (10.64.64.121) by hqmailmbx3.avp.ru (10.64.67.243) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2044.4; Sun, 7 Feb 2021 18:17:38 +0300 From: Arseny Krasnov To: Stefan Hajnoczi , Stefano Garzarella , "Michael S. Tsirkin" , Jason Wang , "David S. Miller" , Jakub Kicinski , Arseny Krasnov , Jorgen Hansen , Andra Paraschiv , Colin Ian King , Alexander Popov CC: , , , , , Subject: [RFC PATCH v4 11/17] virtio/vsock: add SEQPACKET receive logic Date: Sun, 7 Feb 2021 18:17:30 +0300 Message-ID: <20210207151733.805645-1-arseny.krasnov@kaspersky.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210207151259.803917-1-arseny.krasnov@kaspersky.com> References: <20210207151259.803917-1-arseny.krasnov@kaspersky.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Originating-IP: [10.64.64.121] X-ClientProxiedBy: hqmailmbx3.avp.ru (10.64.67.243) To hqmailmbx3.avp.ru (10.64.67.243) X-KSE-ServerInfo: hqmailmbx3.avp.ru, 9 X-KSE-AntiSpam-Interceptor-Info: scan successful X-KSE-AntiSpam-Version: 5.9.16, Database issued on: 02/06/2021 23:52:08 X-KSE-AntiSpam-Status: KAS_STATUS_NOT_DETECTED X-KSE-AntiSpam-Method: none X-KSE-AntiSpam-Rate: 10 X-KSE-AntiSpam-Info: Lua profiles 161679 [Feb 06 2021] X-KSE-AntiSpam-Info: LuaCore: 422 422 763e61bea9fcfcd94e075081cb96e065bc0509b4 X-KSE-AntiSpam-Info: Version: 5.9.16.0 X-KSE-AntiSpam-Info: Envelope from: arseny.krasnov@kaspersky.com X-KSE-AntiSpam-Info: {Prob_from_in_msgid} X-KSE-AntiSpam-Info: {Tracking_date, moscow} X-KSE-AntiSpam-Info: {Tracking_from_domain_doesnt_match_to} X-KSE-AntiSpam-Info: Rate: 10 X-KSE-AntiSpam-Info: Status: not_detected X-KSE-AntiSpam-Info: Method: none X-KSE-Antiphishing-Info: Clean X-KSE-Antiphishing-ScanningType: Deterministic X-KSE-Antiphishing-Method: None X-KSE-Antiphishing-Bases: 02/06/2021 23:55:00 X-KSE-AttachmentFiltering-Interceptor-Info: no applicable attachment filtering rules found X-KSE-Antivirus-Interceptor-Info: scan successful X-KSE-Antivirus-Info: Clean, bases: 2/6/2021 9:17:00 PM X-KSE-BulkMessagesFiltering-Scan-Result: InTheLimit X-KSE-AttachmentFiltering-Interceptor-Info: no applicable attachment filtering rules found X-KSE-BulkMessagesFiltering-Scan-Result: InTheLimit X-KLMS-Rule-ID: 52 X-KLMS-Message-Action: clean X-KLMS-AntiSpam-Status: not scanned, disabled by settings X-KLMS-AntiSpam-Interceptor-Info: not scanned X-KLMS-AntiPhishing: Clean, bases: 2021/02/07 14:21:00 X-KLMS-AntiVirus: Kaspersky Security for Linux Mail Server, version 8.0.3.30, bases: 2021/02/07 10:49:00 #16133380 X-KLMS-AntiVirus-Status: Clean, skipped Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This modifies current receive logic for SEQPACKET support: 1) Inserts 'SEQ_BEGIN' packet to socket's rx queue. 2) Inserts 'RW' packet to socket's rx queue, but without merging with buffer of last packet in queue. 3) Performs check for packet and socket types on receive(if mismatch, then reset connection). Signed-off-by: Arseny Krasnov --- net/vmw_vsock/virtio_transport_common.c | 63 +++++++++++++++++-------- 1 file changed, 44 insertions(+), 19 deletions(-) diff --git a/net/vmw_vsock/virtio_transport_common.c b/net/vmw_vsock/virtio_transport_common.c index 7ac552bfd90b..51b66f8dd7c7 100644 --- a/net/vmw_vsock/virtio_transport_common.c +++ b/net/vmw_vsock/virtio_transport_common.c @@ -397,6 +397,14 @@ virtio_transport_stream_do_dequeue(struct vsock_sock *vsk, return err; } +static u16 virtio_transport_get_type(struct sock *sk) +{ + if (sk->sk_type == SOCK_STREAM) + return VIRTIO_VSOCK_TYPE_STREAM; + else + return VIRTIO_VSOCK_TYPE_SEQPACKET; +} + static inline void virtio_transport_remove_pkt(struct virtio_vsock_pkt *pkt) { list_del(&pkt->list); @@ -1062,25 +1070,27 @@ virtio_transport_recv_enqueue(struct vsock_sock *vsk, goto out; } - /* Try to copy small packets into the buffer of last packet queued, - * to avoid wasting memory queueing the entire buffer with a small - * payload. - */ - if (pkt->len <= GOOD_COPY_LEN && !list_empty(&vvs->rx_queue)) { - struct virtio_vsock_pkt *last_pkt; + if (le16_to_cpu(pkt->hdr.type) == VIRTIO_VSOCK_TYPE_STREAM) { + /* Try to copy small packets into the buffer of last packet queued, + * to avoid wasting memory queueing the entire buffer with a small + * payload. + */ + if (pkt->len <= GOOD_COPY_LEN && !list_empty(&vvs->rx_queue)) { + struct virtio_vsock_pkt *last_pkt; - last_pkt = list_last_entry(&vvs->rx_queue, - struct virtio_vsock_pkt, list); + last_pkt = list_last_entry(&vvs->rx_queue, + struct virtio_vsock_pkt, list); - /* If there is space in the last packet queued, we copy the - * new packet in its buffer. - */ - if (pkt->len <= last_pkt->buf_len - last_pkt->len) { - memcpy(last_pkt->buf + last_pkt->len, pkt->buf, - pkt->len); - last_pkt->len += pkt->len; - free_pkt = true; - goto out; + /* If there is space in the last packet queued, we copy the + * new packet in its buffer. + */ + if (pkt->len <= last_pkt->buf_len - last_pkt->len) { + memcpy(last_pkt->buf + last_pkt->len, pkt->buf, + pkt->len); + last_pkt->len += pkt->len; + free_pkt = true; + goto out; + } } } @@ -1100,9 +1110,13 @@ virtio_transport_recv_connected(struct sock *sk, int err = 0; switch (le16_to_cpu(pkt->hdr.op)) { + case VIRTIO_VSOCK_OP_SEQ_BEGIN: + case VIRTIO_VSOCK_OP_SEQ_END: case VIRTIO_VSOCK_OP_RW: virtio_transport_recv_enqueue(vsk, pkt); - sk->sk_data_ready(sk); + + if (le16_to_cpu(pkt->hdr.op) != VIRTIO_VSOCK_OP_SEQ_BEGIN) + sk->sk_data_ready(sk); return err; case VIRTIO_VSOCK_OP_CREDIT_UPDATE: sk->sk_write_space(sk); @@ -1246,6 +1260,12 @@ virtio_transport_recv_listen(struct sock *sk, struct virtio_vsock_pkt *pkt, return 0; } +static bool virtio_transport_valid_type(u16 type) +{ + return (type == VIRTIO_VSOCK_TYPE_STREAM) || + (type == VIRTIO_VSOCK_TYPE_SEQPACKET); +} + /* We are under the virtio-vsock's vsock->rx_lock or vhost-vsock's vq->mutex * lock. */ @@ -1271,7 +1291,7 @@ void virtio_transport_recv_pkt(struct virtio_transport *t, le32_to_cpu(pkt->hdr.buf_alloc), le32_to_cpu(pkt->hdr.fwd_cnt)); - if (le16_to_cpu(pkt->hdr.type) != VIRTIO_VSOCK_TYPE_STREAM) { + if (!virtio_transport_valid_type(le16_to_cpu(pkt->hdr.type))) { (void)virtio_transport_reset_no_sock(t, pkt); goto free_pkt; } @@ -1288,6 +1308,11 @@ void virtio_transport_recv_pkt(struct virtio_transport *t, } } + if (virtio_transport_get_type(sk) != le16_to_cpu(pkt->hdr.type)) { + (void)virtio_transport_reset_no_sock(t, pkt); + goto free_pkt; + } + vsk = vsock_sk(sk); space_available = virtio_transport_space_update(sk, pkt); -- 2.25.1