Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp1171429pxj; Sat, 8 May 2021 09:35:42 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyi9vKPpYWlv9DjK9BNO8wl6SX1KzbYr4593b+0nMqdKxr++AELCloxY/Xcq/TIF/VFSsPA X-Received: by 2002:a17:906:dd2:: with SMTP id p18mr16608146eji.513.1620491742534; Sat, 08 May 2021 09:35:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620491742; cv=none; d=google.com; s=arc-20160816; b=MkAtuNaXhOH5/74NLi0AUK4RFmmKds19smvSGStVdVtHTB85pJq1KAhQ8pbPYq8n84 UfQgev0TKpkzUqjrIDg89yaVWqapBkB28evNX+Kjf74rHC7iVtOCLOf8RVfvttTmUpM8 0EOUgT5y3aJ/BvpHz4y6njVHU0tsYW7CopPCel54t6FBlqlmHab5klPfX1qIKRpUqWvu 2+7xWDaPK015+vvsjpgsWvyY4o9ecnuTvp62kTzYHHasLA5y3/mw7Xu2thYfN1OYnLJh MjtGRtWdp6fCF56A6nOi9SRnuNB83iwGw3Dbi2kj/XgJSLz+Yc4ut+iHHQSEm7tGx4Jy lW1A== 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=DwyIv4y5dfvW196jntHcFMOEHREAX4ta+yxP6ePDdn0=; b=exsl+eaiP8iVdi8M3UbVSTe0VIWSSeKaTo47Ue85SzqBlkjx/jxW0887CHiUyEXI4B QTLiDUc50OfHjVNCaQX4hfuNJoHZfq4W3M5ruQ6/pnuWcQkheL7S4AJBAWRgimNCNBMr dyJNVbCu7PbOrgXt9T+UZqYwEkLpuWY9zfayCrKfTG2KDVGrDTQX+5mgOklK1KXvq0G8 IA4qRxYzCSWs0uiYO14WlKDumHEK2X1f2YQhtj+YmwOKETCvYkQV3GpNh2j7l14fRqrr bksJNIDHcI3eD6LdcWnhlq0fAFaR6+5OXlTjEozvk1qxadObgVT2T+jj9Et1+auNn2W4 iBbQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kaspersky.com header.s=mail202102 header.b=5ptG1ouq; 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 hc37si3053980ejc.604.2021.05.08.09.35.19; Sat, 08 May 2021 09:35:42 -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=5ptG1ouq; 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 S229863AbhEHQel (ORCPT + 99 others); Sat, 8 May 2021 12:34:41 -0400 Received: from mx12.kaspersky-labs.com ([91.103.66.155]:44259 "EHLO mx12.kaspersky-labs.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229831AbhEHQe3 (ORCPT ); Sat, 8 May 2021 12:34:29 -0400 Received: from relay12.kaspersky-labs.com (unknown [127.0.0.10]) by relay12.kaspersky-labs.com (Postfix) with ESMTP id 1F27B76EE2; Sat, 8 May 2021 19:33:24 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kaspersky.com; s=mail202102; t=1620491604; bh=DwyIv4y5dfvW196jntHcFMOEHREAX4ta+yxP6ePDdn0=; h=From:To:Subject:Date:Message-ID:MIME-Version:Content-Type; b=5ptG1ouqY5AjSt+HlDflu4QKdPzl97s3SsfDtTsb1bEJGZQ3P6cCBYtCFXzze2T7/ 3SP5uyXlrekmiLYoRCC0N1FgWjQtUnxTeRdgkL9dkLWxct317SjgeCXfE9o58lAjOc ZeLT7Y7M8/saW/LSvfeYupRwLkaecFdHC7Trpsvz+Re6zebatuSbJBmKjw9smT6Pe5 /fnM/Y7unnz5Zkbr8mmWq/AJnyNigiTf8CNc2hlEk0F95I/BYNwTgSHcUSEOmLijOT nU/M0X+PXRP1LNbA+xJlQ+o9nu2G4ZQYZED6caDOGrtqkBTFbhUdmsEBcLuAx43oQO TDCLC3nojZ5lA== 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 D022776EC1; Sat, 8 May 2021 19:33:23 +0300 (MSK) Received: from arseniy-pc.avp.ru (10.64.68.128) 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:33:23 +0300 From: Arseny Krasnov To: Stefan Hajnoczi , Stefano Garzarella , "Michael S. Tsirkin" , Jason Wang , "David S. Miller" , Jakub Kicinski , Arseny Krasnov , Jorgen Hansen , Colin Ian King , Norbert Slusarek , Andra Paraschiv CC: , , , , , Subject: [RFC PATCH v9 04/19] af_vsock: implement SEQPACKET receive loop Date: Sat, 8 May 2021 19:33:14 +0300 Message-ID: <20210508163317.3431119-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.68.128] X-ClientProxiedBy: hqmailmbx2.avp.ru (10.64.67.242) 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:21:10 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;arseniy-pc.avp.ru:7.1.1;d41d8cd98f00b204e9800998ecf8427e.com: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:24: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 adds receive loop for SEQPACKET. It looks like receive loop for STREAM, but there is a little bit difference: 1) It doesn't call notify callbacks. 2) It doesn't care about 'SO_SNDLOWAT' and 'SO_RCVLOWAT' values, because there is no sense for these values in SEQPACKET case. 3) It waits until whole record is received or error is found during receiving. 4) It processes and sets 'MSG_TRUNC' flag. So to avoid extra conditions for two types of socket inside one loop, two independent functions were created. Signed-off-by: Arseny Krasnov --- v8 -> v9: 1) 'tmp_record_len' renamed to 'fragment_len'. 2) MSG_TRUNC handled in af_vsock.c instead of transport. 3) 'flags' still passed to transport for MSG_PEEK support. include/net/af_vsock.h | 4 +++ net/vmw_vsock/af_vsock.c | 72 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 75 insertions(+), 1 deletion(-) diff --git a/include/net/af_vsock.h b/include/net/af_vsock.h index b1c717286993..5175f5a52ce1 100644 --- a/include/net/af_vsock.h +++ b/include/net/af_vsock.h @@ -135,6 +135,10 @@ struct vsock_transport { bool (*stream_is_active)(struct vsock_sock *); bool (*stream_allow)(u32 cid, u32 port); + /* SEQ_PACKET. */ + ssize_t (*seqpacket_dequeue)(struct vsock_sock *vsk, struct msghdr *msg, + int flags, bool *msg_ready); + /* Notification. */ int (*notify_poll_in)(struct vsock_sock *, size_t, bool *); int (*notify_poll_out)(struct vsock_sock *, size_t, bool *); diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c index c4f6bfa1e381..78b9af545ca8 100644 --- a/net/vmw_vsock/af_vsock.c +++ b/net/vmw_vsock/af_vsock.c @@ -1974,6 +1974,73 @@ static int __vsock_stream_recvmsg(struct sock *sk, struct msghdr *msg, return err; } +static int __vsock_seqpacket_recvmsg(struct sock *sk, struct msghdr *msg, + size_t len, int flags) +{ + const struct vsock_transport *transport; + bool msg_ready; + struct vsock_sock *vsk; + ssize_t record_len; + long timeout; + int err = 0; + DEFINE_WAIT(wait); + + vsk = vsock_sk(sk); + transport = vsk->transport; + + timeout = sock_rcvtimeo(sk, flags & MSG_DONTWAIT); + msg_ready = false; + record_len = 0; + + while (1) { + ssize_t fragment_len; + + if (vsock_wait_data(sk, &wait, timeout, NULL, 0) <= 0) { + /* In case of any loop break(timeout, signal + * interrupt or shutdown), we report user that + * nothing was copied. + */ + err = 0; + break; + } + + fragment_len = transport->seqpacket_dequeue(vsk, msg, flags, &msg_ready); + + if (fragment_len < 0) { + err = -ENOMEM; + break; + } + + record_len += fragment_len; + + if (msg_ready) + break; + } + + if (sk->sk_err) + err = -sk->sk_err; + else if (sk->sk_shutdown & RCV_SHUTDOWN) + err = 0; + + if (msg_ready && err == 0) { + /* User sets MSG_TRUNC, so return real length of + * packet. + */ + if (flags & MSG_TRUNC) + err = record_len; + else + err = len - msg->msg_iter.count; + + /* Always set MSG_TRUNC if real length of packet is + * bigger than user's buffer. + */ + if (record_len > len) + msg->msg_flags |= MSG_TRUNC; + } + + return err; +} + static int vsock_connectible_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, int flags) @@ -2029,7 +2096,10 @@ vsock_connectible_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, goto out; } - err = __vsock_stream_recvmsg(sk, msg, len, flags); + if (sk->sk_type == SOCK_STREAM) + err = __vsock_stream_recvmsg(sk, msg, len, flags); + else + err = __vsock_seqpacket_recvmsg(sk, msg, len, flags); out: release_sock(sk); -- 2.25.1