Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp1172327pxj; Sat, 8 May 2021 09:37:24 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz/8cB0XSwi/bXJgeUmlJNg7ShK76vRQ/BrF3ozX2Ut99lk7dfp9oUL8bWyAzG3bffjBJ4z X-Received: by 2002:aa7:d702:: with SMTP id t2mr18084348edq.367.1620491843960; Sat, 08 May 2021 09:37:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620491843; cv=none; d=google.com; s=arc-20160816; b=gLGtSP50rs2ubDvrplsyc8GOJP1kTy6Zw4nsifOdk6fHzip2HIdZp/rmN+xOv42UuZ eNf03YEMxX0ACpMLJ9WsGJXH0f8OzbOjHktm4zlEAFSKWA5bCqmajZ2Oo54TpK94Cp7R Ev8posr8AN8Spf3XwGpg1w+AJ+V2sODSng+i54ROSwBHZ9BTByzBf4RfIGP/GV3GPlRw UXcl8qve7Zp3GbL5Hxg12vIe1M6K7+mxr0y0Ked55cy7XnNRvWx/wWOLsE0bUQH8fEah kzohslFnp8DrMSyfHp8x7k+OdJ4eRQdEoeSUXS0IcoPLzHy5tdOB/OkGXrVj8SBYP00v v9Ng== 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=be+lwLv4Z3bqeauUmTcnIM8/IEvfNHb3b3uBl+rtyGw=; b=zn9kGX4KUseIiSgz35/L2B2f67qw9+RMcbrgKGZPhXYppvlcZD/yQqKJeB33sG3Cpr DM7J3bZF78wbmxbzbo6roUqRt5DpFam5PHsWlFw8KEXpw0hqHVCaJHWpJkosoKr4DiN7 cThbWEJBDY/Z0kdtv3OT9evdDNqNL9FdjaUkxJL5u7J7u+gf/VLyE1UWEz2CAOJSSK8G oQ5K6p4SAPTljjAcZ+LpSQac+4OynJ+NgHQ6IAZ+2ZqJLh5RL7sX95veFr6ZSIbo2Q2H uKbW0C8LdHTsWuQ7vJuik/jpBu2rSpiCaf6B+WGW3BSqLl1HZKlJjKXlNQZzqW/03PPi lWPw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kaspersky.com header.s=mail202102 header.b=6xPw1PJH; 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 c9si8654546edv.186.2021.05.08.09.37.01; Sat, 08 May 2021 09:37:23 -0700 (PDT) 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=mail202102 header.b=6xPw1PJH; 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 S230059AbhEHQhE (ORCPT + 99 others); Sat, 8 May 2021 12:37:04 -0400 Received: from mx13.kaspersky-labs.com ([91.103.66.164]:63567 "EHLO mx13.kaspersky-labs.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230039AbhEHQg6 (ORCPT ); Sat, 8 May 2021 12:36:58 -0400 Received: from relay13.kaspersky-labs.com (unknown [127.0.0.10]) by relay13.kaspersky-labs.com (Postfix) with ESMTP id 877F85210F7; Sat, 8 May 2021 19:35:50 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kaspersky.com; s=mail202102; t=1620491750; bh=be+lwLv4Z3bqeauUmTcnIM8/IEvfNHb3b3uBl+rtyGw=; h=From:To:Subject:Date:Message-ID:MIME-Version:Content-Type; b=6xPw1PJHlzN7WY6ndXV8vbWz91K2+9LV7xpUd+YOSFgm6lwMVAms6Bdv0sgIJvm37 WHWoJrtAydkDp/Q7HeKXJGfe4LQnwqKj7t40+Shb5IuG8TLk6G38QdDLcTpoKaIXJb AB01poXRF/W8/CeWQ9X8gwQtR7wcXq9N45QqeP86R9fn7pKBGlEmNy9PEua9haU3kA l7p4Rn/pwszjobpcA+3xzw8T3dyYq5B3esuqT6XHxDDIkoBiBJSmwuFNRl1uJIoMD/ ZkzA6cMxcg7dcA+ZJUAoizFRD30al8L6UjWm6PxA633PSJItPz58o48ZkoIJdOqs0r TwVTwouPjLnvQ== 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 mailhub13.kaspersky-labs.com (Postfix) with ESMTPS id 3C5ED521007; Sat, 8 May 2021 19:35:50 +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.2176.2; Sat, 8 May 2021 19:35:49 +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 , Norbert Slusarek , Colin Ian King CC: , , , , , Subject: [RFC PATCH v9 12/19] virtio/vsock: add SEQPACKET receive logic Date: Sat, 8 May 2021 19:35:40 +0300 Message-ID: <20210508163544.3432132-1-arseny.krasnov@kaspersky.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210508163027.3430238-1-arseny.krasnov@kaspersky.com> References: <20210508163027.3430238-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: hqmailmbx1.avp.ru (10.64.67.241) 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.20, Database issued on: 05/08/2021 16:27:11 X-KSE-AntiSpam-Status: KAS_STATUS_NOT_DETECTED X-KSE-AntiSpam-Method: none X-KSE-AntiSpam-Rate: 10 X-KSE-AntiSpam-Info: Lua profiles 163552 [May 08 2021] X-KSE-AntiSpam-Info: Version: 5.9.20.0 X-KSE-AntiSpam-Info: Envelope from: arseny.krasnov@kaspersky.com X-KSE-AntiSpam-Info: LuaCore: 445 445 d5f7ae5578b0f01c45f955a2a751ac25953290c9 X-KSE-AntiSpam-Info: {Prob_from_in_msgid} X-KSE-AntiSpam-Info: {Tracking_from_domain_doesnt_match_to} X-KSE-AntiSpam-Info: 127.0.0.199:7.1.2;d41d8cd98f00b204e9800998ecf8427e.com:7.1.1;arseniy-pc.avp.ru:7.1.1;kaspersky.com:7.1.1 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: 05/08/2021 16:29: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: 08.05.2021 12:32:00 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/05/08 15:50:00 X-KLMS-AntiVirus: Kaspersky Security for Linux Mail Server, version 8.0.3.30, bases: 2021/05/08 12:32:00 #16600610 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 'RW' packet to socket's rx queue, but without merging with buffer of last packet in queue. 2) Performs check for packet and socket types on receive(if mismatch, then reset connection). Signed-off-by: Arseny Krasnov Reviewed-by: Stefano Garzarella --- net/vmw_vsock/virtio_transport_common.c | 28 +++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/net/vmw_vsock/virtio_transport_common.c b/net/vmw_vsock/virtio_transport_common.c index f649a21dd23b..7fea0a2192f7 100644 --- a/net/vmw_vsock/virtio_transport_common.c +++ b/net/vmw_vsock/virtio_transport_common.c @@ -165,6 +165,14 @@ void virtio_transport_deliver_tap_pkt(struct virtio_vsock_pkt *pkt) } EXPORT_SYMBOL_GPL(virtio_transport_deliver_tap_pkt); +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; +} + /* This function can only be used on connecting/connected sockets, * since a socket assigned to a transport is required. * @@ -980,11 +988,15 @@ virtio_transport_recv_enqueue(struct vsock_sock *vsk, /* 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) { + if ((pkt->len <= last_pkt->buf_len - last_pkt->len) && + !(le32_to_cpu(last_pkt->hdr.flags) & VIRTIO_VSOCK_SEQ_EOR)) { memcpy(last_pkt->buf + last_pkt->len, pkt->buf, pkt->len); last_pkt->len += pkt->len; free_pkt = true; + + if (le32_to_cpu(pkt->hdr.flags) & VIRTIO_VSOCK_SEQ_EOR) + last_pkt->hdr.flags |= cpu_to_le32(VIRTIO_VSOCK_SEQ_EOR); goto out; } } @@ -1150,6 +1162,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. */ @@ -1175,7 +1193,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; } @@ -1192,6 +1210,12 @@ 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); + sock_put(sk); + goto free_pkt; + } + vsk = vsock_sk(sk); lock_sock(sk); -- 2.25.1