From nobody Sun Dec 14 13:56:09 2025 Received: from mail-pl1-f172.google.com (mail-pl1-f172.google.com [209.85.214.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 623B418B475 for ; Fri, 7 Feb 2025 06:11:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738908671; cv=none; b=nPYrxLAsnwnE+fWW5l7VY1ZCVfKYRVG18/+596EbmlmYPna9YwLLbkD3HxL7Bj4HR9gcmcwgLzdOStDSe102stWbJGauVmR9Vtjz4s/Thjd5i2XgVjSr1UsX0IqMgDcf485AgW9oioB8tdUHETc3eBQQp+dmue2rMeMVnCpSqjg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738908671; c=relaxed/simple; bh=cdUkce1+zju76xB2ulgsqkhH2BtZWQUF+tczDHuY9Ws=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=W4OF5zBEz7eMjLgtPf5rGbkbQm0ZFYAurO34plJ3iAHPP54zjg3QNYZA6WyPrdqfm2XjysranSGiOC8sd9pz1tXXOs1xgD+CCYGR27oe2u6AUn2+O+9SbJGFtPzzy3Nq37cXkjKITsoLbplUFAQDnlsbBeHBmlkMf4gyxY0Rans= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=daynix.com; spf=pass smtp.mailfrom=daynix.com; dkim=pass (2048-bit key) header.d=daynix-com.20230601.gappssmtp.com header.i=@daynix-com.20230601.gappssmtp.com header.b=Qzdq5QMF; arc=none smtp.client-ip=209.85.214.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=daynix.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=daynix.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=daynix-com.20230601.gappssmtp.com header.i=@daynix-com.20230601.gappssmtp.com header.b="Qzdq5QMF" Received: by mail-pl1-f172.google.com with SMTP id d9443c01a7336-2166651f752so37283905ad.3 for ; Thu, 06 Feb 2025 22:11:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=daynix-com.20230601.gappssmtp.com; s=20230601; t=1738908669; x=1739513469; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=u8e6Q2IF1AlrwVhf0WEzy1BrH8KeyaluzZCG0JrRNn4=; b=Qzdq5QMFTDdclgtr7jpZ1OdQsvw37EwK69Zy1SuCQG+t9cohiUx8Nne7KfQU5/YDBV d0kz2bs7JP1y+I1fNGFYIBvhTv0Zo4RQayKiYxSTNHBFDTGKBp2LKi2q5qcmr809QspU Mo9+2+0Q+iZgV8qRKLYSUGn+bHWCUckSzEL1HkL1KTAGMZrbw0ZqPoi5ZtqhfW0ewwk4 GeBuwTr2KO8kY6cMMO0XlAmaeaYRCWLxYBOvBcq+5vbxrc/BBq7FppCE01xFeWLoM+ye co3rtAN9iuL5PhTrX0oSltdAlDVpZxUSCkWAOmVO0OhNq3soAzQT6yma3G3WvtRlUVYn caxQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738908669; x=1739513469; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=u8e6Q2IF1AlrwVhf0WEzy1BrH8KeyaluzZCG0JrRNn4=; b=chslL3AXdcDVTjmdHLy2Do+pqw6qbIbaNZdI03vnmCvxLSmo+VI9/iHy48wbBnwrIO 0PLlnaAOn2CpNvMnHFcS7PigmQXCNxMboq4OutTB7XReXL3i7AGc2GKlfwOKfZqBuxBX wvAA8P7D7cRW1CnNA2P2Soxsm/wA5MlyZqlmLixrVdgc714F7rW8tmxGNayoh+hYjlv5 c1DZU9/+iDDMx5rLTZQ56ks9sf8agwiAGhDiXIgpGhh+SAN7R8+B/MAQ3fndwkDBMdvb n5mTw5Nf/ZaQpR6SWOxA/FCYYXa0th1uhpMtvn7IciTLbbo5E8XeN09lKOLSe0My6m1O FbAA== X-Forwarded-Encrypted: i=1; AJvYcCXPYVZRHiToDFuzdBAG30gVfWxHY3Qey3BZbFr9x5g5yTXJdRNxx8mAeIynekvNKTMd+/m7m3oRRZwNKWc=@vger.kernel.org X-Gm-Message-State: AOJu0YwzZANnisM7iXDkB2fyUaktk1dCbwb71KbvZN9UOJvbxgsvftJe EX0QyMwLiraD+duVY8e4/9SPyFE0GPj7oVqz3sTRNrBb3YbBvedruL8EgwFTFcA= X-Gm-Gg: ASbGncvr2LIWkvPWqnLWBaw+EUtdMxUN1fHqRZplKen38ufI72jyyj0nZ4jszRP+mCy 94xTIxEzF+YFfJ8i4GxrqTv2anLNcW/vBLf0QKFH3P/3kB2ksS7HZJRSqrAyVBRQpeEz5GpRkHD nkc0uuyXS/q1GlA0r1IMbW1lEpf0ZnaqThzekRM4SP5RdOs5T0vFSEcMnReA/auve5mgt6INZ5R d4RvUlanQEIGramVxdsKl9wxcLVcgisS1+ioil4jz+I7sYA3YQjixis8OzT7ViwGvtk+zXEGYb/ ZqlBh2SmZNVmP4XFj7E= X-Google-Smtp-Source: AGHT+IHsiQFjzXezkiITWyryKLHFxWaOkXCA3VROnOenVsONjd60T0L0zqwo9kfDi5iWVlXHr3UF2g== X-Received: by 2002:a17:903:19cd:b0:216:73f0:ef63 with SMTP id d9443c01a7336-21f4e7ae7cfmr37137465ad.49.1738908668736; Thu, 06 Feb 2025 22:11:08 -0800 (PST) Received: from localhost ([157.82.205.237]) by smtp.gmail.com with UTF8SMTPSA id d9443c01a7336-21f3683d729sm22605005ad.124.2025.02.06.22.11.03 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 06 Feb 2025 22:11:08 -0800 (PST) From: Akihiko Odaki Date: Fri, 07 Feb 2025 15:10:51 +0900 Subject: [PATCH net-next v6 1/7] tun: Refactor CONFIG_TUN_VNET_CROSS_LE Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250207-tun-v6-1-fb49cf8b103e@daynix.com> References: <20250207-tun-v6-0-fb49cf8b103e@daynix.com> In-Reply-To: <20250207-tun-v6-0-fb49cf8b103e@daynix.com> To: Jonathan Corbet , Willem de Bruijn , Jason Wang , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , "Michael S. Tsirkin" , Xuan Zhuo , Shuah Khan , linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, kvm@vger.kernel.org, virtualization@lists.linux-foundation.org, linux-kselftest@vger.kernel.org, Yuri Benditovich , Andrew Melnychenko , Stephen Hemminger , gur.stavi@huawei.com, devel@daynix.com, Akihiko Odaki Cc: Willem de Bruijn X-Mailer: b4 0.14.2 Check IS_ENABLED(CONFIG_TUN_VNET_CROSS_LE) to save some lines and make future changes easier. Signed-off-by: Akihiko Odaki Reviewed-by: Willem de Bruijn --- drivers/net/tun.c | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/drivers/net/tun.c b/drivers/net/tun.c index e816aaba8e5f2ed06f8832f79553b6c976e75bb8..4b189cbd28e63ec6325073d9a76= 78f4210bff3e1 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -298,17 +298,21 @@ static bool tun_napi_frags_enabled(const struct tun_f= ile *tfile) return tfile->napi_frags_enabled; } =20 -#ifdef CONFIG_TUN_VNET_CROSS_LE static inline bool tun_legacy_is_little_endian(struct tun_struct *tun) { - return tun->flags & TUN_VNET_BE ? false : - virtio_legacy_is_little_endian(); + bool be =3D IS_ENABLED(CONFIG_TUN_VNET_CROSS_LE) && + (tun->flags & TUN_VNET_BE); + + return !be && virtio_legacy_is_little_endian(); } =20 static long tun_get_vnet_be(struct tun_struct *tun, int __user *argp) { int be =3D !!(tun->flags & TUN_VNET_BE); =20 + if (!IS_ENABLED(CONFIG_TUN_VNET_CROSS_LE)) + return -EINVAL; + if (put_user(be, argp)) return -EFAULT; =20 @@ -319,6 +323,9 @@ static long tun_set_vnet_be(struct tun_struct *tun, int= __user *argp) { int be; =20 + if (!IS_ENABLED(CONFIG_TUN_VNET_CROSS_LE)) + return -EINVAL; + if (get_user(be, argp)) return -EFAULT; =20 @@ -329,22 +336,6 @@ static long tun_set_vnet_be(struct tun_struct *tun, in= t __user *argp) =20 return 0; } -#else -static inline bool tun_legacy_is_little_endian(struct tun_struct *tun) -{ - return virtio_legacy_is_little_endian(); -} - -static long tun_get_vnet_be(struct tun_struct *tun, int __user *argp) -{ - return -EINVAL; -} - -static long tun_set_vnet_be(struct tun_struct *tun, int __user *argp) -{ - return -EINVAL; -} -#endif /* CONFIG_TUN_VNET_CROSS_LE */ =20 static inline bool tun_is_little_endian(struct tun_struct *tun) { --=20 2.48.1 From nobody Sun Dec 14 13:56:09 2025 Received: from mail-pl1-f182.google.com (mail-pl1-f182.google.com [209.85.214.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E39F715B99E for ; Fri, 7 Feb 2025 06:11:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738908679; cv=none; b=S1/1LiQ+VpCxLTcV53k8CfumctMQ33siCTNkIshQ5aqg1r+rpKXE2kc+n8Oq1Mn9caV5HscntGg68kPD68QrdZuKSbATWZcDhSGbh82exSrwtSSq9NMavUtT31f7+rUirsxNLOF/79Iod8d4VBBUHGtbPYmrdradRve/lI0H8pk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738908679; c=relaxed/simple; bh=jE35WmComX5JeKqlu8MY6L9RXnyoavgFojt+bgtRKqY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=sZRq+fesCwJ+8roDYqqQAEMUYJNvPZ+lraaHM4UOe0zhypxlCwgWiIO+TPAaaNWnH7KwS3+rAz+SnARiKGRb29gfSz2cjHztnJYwGwDkOgEAm01kFnb0XeiQPqri0TnUcqFFTJNLeme2khz/Ne6AMRFHqiC8pKodvwtU8P+vtpE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=daynix.com; spf=pass smtp.mailfrom=daynix.com; dkim=pass (2048-bit key) header.d=daynix-com.20230601.gappssmtp.com header.i=@daynix-com.20230601.gappssmtp.com header.b=nDoZfe5f; arc=none smtp.client-ip=209.85.214.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=daynix.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=daynix.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=daynix-com.20230601.gappssmtp.com header.i=@daynix-com.20230601.gappssmtp.com header.b="nDoZfe5f" Received: by mail-pl1-f182.google.com with SMTP id d9443c01a7336-21f50895565so5177635ad.2 for ; Thu, 06 Feb 2025 22:11:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=daynix-com.20230601.gappssmtp.com; s=20230601; t=1738908676; x=1739513476; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=vgBnzmCjscGqJo3YceNPZPrt+CM1bxg86tC2DNlkHjM=; b=nDoZfe5fNttKlPGp0pg8AHWIMQSrS//PVPZnkOL/zPNLcFJ9KS5JryBvAz9UAZ7ibO N4mpwvHHrkT24be8/dvDszXvXKsaD2ByR20q1elqKDW4JlBW27aTH5JbyGQQr7Frw+Hv lCYYuRbg9tl0SvxvCA4p9SxJ5XE9CTUxhc1qcfGYo354mBp1VH8y3zw8KWgQ/1q9/n6Q 8tI7gFxXMtMBfQcEECxTTMX7xRHR8Zsc+w4ZbIaFGfmJ/sJ6egExGF8ig/OANUY6kZSr CUG/iZ3pqrF0ktdKftfZhc+AqkQIp2RLeTpGfrP7FrkKFjJ3Rssuv65jmyKgUzT3I2h5 v69A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738908676; x=1739513476; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=vgBnzmCjscGqJo3YceNPZPrt+CM1bxg86tC2DNlkHjM=; b=EBa80OqX8SYPbWZsRhhirxONZNLNuajWWC4ULCnM/aHyskYhaCqEbr4tsGtt5PAtIH /BQiIks4X2vhrntW3Io8svmG1cbLnlgwI9B8OCaiKyJkqo8+220Eedn/8r2mTnKs7zZB 5d7ZyvmSDbS/4ivBKiT2CSumapB+1jB+dU3RBgkjtp8rb7NFKoTgcrK1Ey/tpr/rklpS 0wsWXB7x0RFSwjA04gMNBDSfl033bIDCEWU1zug6PlGGwtB4a0HFmilcvTRCdUmhyBFW cQ7lf0mb7ciczQyywpBwwllxgTocH+KHMXW6VZbqznATjlZi7/dUOMJqGG6NOkFREJFg mYtw== X-Forwarded-Encrypted: i=1; AJvYcCWBHblVcw6h794s9oZheZTCUYblEzv3S1B3SUmMmOfGqiSTttFq2uezoSN/Db1/pnYTKHokN6MpJW8gmWQ=@vger.kernel.org X-Gm-Message-State: AOJu0YwPRJaxGfsIJnCJ3YZR2/72YkoBoC9/udu9kAtfeQ0WfnS1b9oS stR5bzRTNDxh7x8AWN6d9Sj5gpcAvFml9LQqUbdQqWeTobEivLvWdBy5LLZtCr8= X-Gm-Gg: ASbGncvrudgZMlh+eSC/m6pAFk5Du5TKEiGQ4MqiNqQS0OgtpMjPxWJueCGCHvSpX7h yKggYymfgzza0IdX7xvGuDs96miHNxZ92KFCQqFupcXShcT8H3tv41WmDG1Fw+G2Uwc3mM61C4N MpLW+R10W8CZY2wlzRqNqjzPr/VbMaZ1ycu+7wxIUJBhapeXjjmoqZ2ZpWe2qqE2YFU482NIE9U JypZQO4q0T1HCjUtBmsUsUYvWJ0ZN37jWo5TPkGKsYAqLWPJuDEDC8aAkDDiizKuYPAq5LIbLHl pAhDpWbEXVPvCDk5KCg= X-Google-Smtp-Source: AGHT+IHNm8Qe5PeRd2q8oSkdrncjlnlT7yuIXN9pgtXzJ5BMLmj/G1sZ2QlSRnuDA+GVs8YfE9jCcA== X-Received: by 2002:a05:6a00:244e:b0:727:3c8f:3707 with SMTP id d2e1a72fcca58-7305d53a584mr3469430b3a.23.1738908676268; Thu, 06 Feb 2025 22:11:16 -0800 (PST) Received: from localhost ([157.82.205.237]) by smtp.gmail.com with UTF8SMTPSA id d2e1a72fcca58-73048ad2623sm2302419b3a.60.2025.02.06.22.11.10 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 06 Feb 2025 22:11:15 -0800 (PST) From: Akihiko Odaki Date: Fri, 07 Feb 2025 15:10:52 +0900 Subject: [PATCH net-next v6 2/7] tun: Keep hdr_len in tun_get_user() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250207-tun-v6-2-fb49cf8b103e@daynix.com> References: <20250207-tun-v6-0-fb49cf8b103e@daynix.com> In-Reply-To: <20250207-tun-v6-0-fb49cf8b103e@daynix.com> To: Jonathan Corbet , Willem de Bruijn , Jason Wang , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , "Michael S. Tsirkin" , Xuan Zhuo , Shuah Khan , linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, kvm@vger.kernel.org, virtualization@lists.linux-foundation.org, linux-kselftest@vger.kernel.org, Yuri Benditovich , Andrew Melnychenko , Stephen Hemminger , gur.stavi@huawei.com, devel@daynix.com, Akihiko Odaki Cc: Willem de Bruijn X-Mailer: b4 0.14.2 hdr_len is repeatedly used so keep it in a local variable. Signed-off-by: Akihiko Odaki Reviewed-by: Willem de Bruijn --- drivers/net/tun.c | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 4b189cbd28e63ec6325073d9a7678f4210bff3e1..c204c1c0d75bc7d336ec315099a= 5a60d5d70ea82 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -1747,6 +1747,7 @@ static ssize_t tun_get_user(struct tun_struct *tun, s= truct tun_file *tfile, struct virtio_net_hdr gso =3D { 0 }; int good_linear; int copylen; + int hdr_len =3D 0; bool zerocopy =3D false; int err; u32 rxhash =3D 0; @@ -1773,19 +1774,21 @@ static ssize_t tun_get_user(struct tun_struct *tun,= struct tun_file *tfile, if (!copy_from_iter_full(&gso, sizeof(gso), from)) return -EFAULT; =20 - if ((gso.flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) && - tun16_to_cpu(tun, gso.csum_start) + tun16_to_cpu(tun, gso.csum_offse= t) + 2 > tun16_to_cpu(tun, gso.hdr_len)) - gso.hdr_len =3D cpu_to_tun16(tun, tun16_to_cpu(tun, gso.csum_start) + t= un16_to_cpu(tun, gso.csum_offset) + 2); + hdr_len =3D tun16_to_cpu(tun, gso.hdr_len); =20 - if (tun16_to_cpu(tun, gso.hdr_len) > len) + if (gso.flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) { + hdr_len =3D max(tun16_to_cpu(tun, gso.csum_start) + tun16_to_cpu(tun, g= so.csum_offset) + 2, hdr_len); + gso.hdr_len =3D cpu_to_tun16(tun, hdr_len); + } + + if (hdr_len > len) return -EINVAL; iov_iter_advance(from, vnet_hdr_sz - sizeof(gso)); } =20 if ((tun->flags & TUN_TYPE_MASK) =3D=3D IFF_TAP) { align +=3D NET_IP_ALIGN; - if (unlikely(len < ETH_HLEN || - (gso.hdr_len && tun16_to_cpu(tun, gso.hdr_len) < ETH_HLEN))) + if (unlikely(len < ETH_HLEN || (hdr_len && hdr_len < ETH_HLEN))) return -EINVAL; } =20 @@ -1798,9 +1801,7 @@ static ssize_t tun_get_user(struct tun_struct *tun, s= truct tun_file *tfile, * enough room for skb expand head in case it is used. * The rest of the buffer is mapped from userspace. */ - copylen =3D gso.hdr_len ? tun16_to_cpu(tun, gso.hdr_len) : GOODCOPY_LEN; - if (copylen > good_linear) - copylen =3D good_linear; + copylen =3D min(hdr_len ? hdr_len : GOODCOPY_LEN, good_linear); linear =3D copylen; iov_iter_advance(&i, copylen); if (iov_iter_npages(&i, INT_MAX) <=3D MAX_SKB_FRAGS) @@ -1821,10 +1822,7 @@ static ssize_t tun_get_user(struct tun_struct *tun, = struct tun_file *tfile, } else { if (!zerocopy) { copylen =3D len; - if (tun16_to_cpu(tun, gso.hdr_len) > good_linear) - linear =3D good_linear; - else - linear =3D tun16_to_cpu(tun, gso.hdr_len); + linear =3D min(hdr_len, good_linear); } =20 if (frags) { --=20 2.48.1 From nobody Sun Dec 14 13:56:09 2025 Received: from mail-pl1-f177.google.com (mail-pl1-f177.google.com [209.85.214.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8B388235BEA for ; Fri, 7 Feb 2025 06:11:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738908686; cv=none; b=Xhg+QkfFlUUL/BJ+9RrYeRoN46E6Xvx+t5l51LuejRlSw+m0HyqPc23Kvsobw/1TnKTJCJgq//y1Q3wPk10cN/biLuE1yLgahMRuV6qzn2xtmu1lWLhIcuzBxIFE0PpWtAqrAABTPHI4b3QRgq6ePib0531RYeebqCwMfQ8A3QI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738908686; c=relaxed/simple; bh=bBQXhUVCx6X6zVGj6QFAXw2H5wdiIPqhAd8Xerl1xf4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=CAzyYkwcU7KOUhkf7hL2S9iEx+WxkhDgkyiMK1Xp/n5WmPU13yp1hBjPXNqNLH0NZE60M3NiXJPpCDYsK1SOamJHhLooWiGOAYEOzLjcmlyw0EWuev/tXD322AWd0LyR3VZ9vaPISHkD/R/j4xQr/eGqOg6+J/7fHjx0cs56d6w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=daynix.com; spf=pass smtp.mailfrom=daynix.com; dkim=pass (2048-bit key) header.d=daynix-com.20230601.gappssmtp.com header.i=@daynix-com.20230601.gappssmtp.com header.b=qslocyaP; arc=none smtp.client-ip=209.85.214.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=daynix.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=daynix.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=daynix-com.20230601.gappssmtp.com header.i=@daynix-com.20230601.gappssmtp.com header.b="qslocyaP" Received: by mail-pl1-f177.google.com with SMTP id d9443c01a7336-21f20666e72so35854745ad.1 for ; Thu, 06 Feb 2025 22:11:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=daynix-com.20230601.gappssmtp.com; s=20230601; t=1738908684; x=1739513484; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=t/RuN2hMDX+DTthFVqrAA3p7jQCQREQBjwaJUnbA1mI=; b=qslocyaPwuARW/7d/Lfk6LcV7OSOxduHKY8FvvF5dnIF3J6MfSYTHqrLEbja7R3v0L C29IZkXXYSupvfp1kZrXJI4WJKr+V17cIQ08kernY4791Lfif8jBt59PxuIUkkWDDDU6 cZPDZxsEDHrmos58bd9dCmXc0IIY72ZYMla+KQnL6SORZDoknh1obgcADQbzCIYYG55l GDQLomgJd4I2Y6LEIuMfM6kwaTXCX2fBDE2wPUHtVT0SQXjABKe6WOUAL0ajHUChoLfY 046HKLED9vxkYaEwZ2UlzBz4KQHQhu9UT1EzOinaEE67DCPnlw0mrmDmEZSRvoeIhxi7 UIKQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738908684; x=1739513484; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=t/RuN2hMDX+DTthFVqrAA3p7jQCQREQBjwaJUnbA1mI=; b=rd27kfUkd5pMxG8266mRobF5/PdMYof49AaJ+sOFfgLIvn8KFLF8R3wVbH7kAYIZP6 V71AUa5/uO4D+l0eaMf3jp/SqgswFDNodfulWMm7PVqPsNKkOH/mJXjAn8mjrHVwHZ8Z 8tMnRn5GBKbH8Z9PGVRyuBd72Zrt+0FGcu0ngkXlamosYZAF8OPUdOSM/6+hSFxG9cI7 D8pjU5gRKRHpnvd0hniy+EjLbn6kvb13iR4lUTSCTpW9Q1+glUrty6ngnNXVp7Fe6TFh Kbx5c2LigFFMdPFgkfmK67K8yvXKSTnAU8rwKZl6udggKYz+AVUEybfdEz4ob45asNvf rTig== X-Forwarded-Encrypted: i=1; AJvYcCX1XQWYR+zLXXFNJuVjpZblRUBrYSLnLVe4ltAkMAW5JG/Y2svH3a4gT/YSIVTwH8OZzsmATrHHfRuTxH4=@vger.kernel.org X-Gm-Message-State: AOJu0YxcrzSh75hE+8Ip8O4zwQHohS16QemUeXlWl4TbmZqGHuabRZ/Q 1wfyBz85LRv1F3qmpdlzHRaithDBE+terju0jvcQt83qFfjSEg2wHyX9YVuOnUc= X-Gm-Gg: ASbGncvCMLFr1uYZkJE9e5Rn10ELFkfi0VKyM4ftxbdPSkOXHzc75mREA8llzoYpHw7 2C685wVSJLFBL80mrclh+xwnYYBW9KhDVMh/dYC33t7Xj1jwLR/mOg5gdbeWPbNkiKX3X2HTMlz 5La8aSAcrjbjq9G6NnEyvecNImE4+auztlkXbwXO+Hg0aMYtTpsCrjXO9iND8yt60nwYfc+JMQv X0sCEMPlYbJ/SxUjHWHrCKcd8KDpdu56Av3YeIjw5V4XayTKT+RjLcE5q8336QAlyafHKi7nc/m qtE7qGmpRY7HIS/e1YQ= X-Google-Smtp-Source: AGHT+IGKXNfBtm98NzYUcrTp3XJuz6e3YpYHzpl1lbmzgAWqjm0gMeX4pN7AZUkDcA3OCHSyub6G8g== X-Received: by 2002:a17:902:ef09:b0:216:386e:dbc with SMTP id d9443c01a7336-21f4e6c22e7mr33527705ad.13.1738908683719; Thu, 06 Feb 2025 22:11:23 -0800 (PST) Received: from localhost ([157.82.205.237]) by smtp.gmail.com with UTF8SMTPSA id d9443c01a7336-21f3687c5d5sm22833125ad.166.2025.02.06.22.11.18 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 06 Feb 2025 22:11:23 -0800 (PST) From: Akihiko Odaki Date: Fri, 07 Feb 2025 15:10:53 +0900 Subject: [PATCH net-next v6 3/7] tun: Decouple vnet from tun_struct Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250207-tun-v6-3-fb49cf8b103e@daynix.com> References: <20250207-tun-v6-0-fb49cf8b103e@daynix.com> In-Reply-To: <20250207-tun-v6-0-fb49cf8b103e@daynix.com> To: Jonathan Corbet , Willem de Bruijn , Jason Wang , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , "Michael S. Tsirkin" , Xuan Zhuo , Shuah Khan , linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, kvm@vger.kernel.org, virtualization@lists.linux-foundation.org, linux-kselftest@vger.kernel.org, Yuri Benditovich , Andrew Melnychenko , Stephen Hemminger , gur.stavi@huawei.com, devel@daynix.com, Akihiko Odaki Cc: Willem de Bruijn X-Mailer: b4 0.14.2 Decouple vnet-related functions from tun_struct so that we can reuse them for tap in the future. Signed-off-by: Akihiko Odaki Reviewed-by: Willem de Bruijn --- drivers/net/tun.c | 51 ++++++++++++++++++++++++++------------------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/drivers/net/tun.c b/drivers/net/tun.c index c204c1c0d75bc7d336ec315099a5a60d5d70ea82..28a1af1de9d704ed5cc51aac3d9= 9bc095cb28ba5 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -298,17 +298,17 @@ static bool tun_napi_frags_enabled(const struct tun_f= ile *tfile) return tfile->napi_frags_enabled; } =20 -static inline bool tun_legacy_is_little_endian(struct tun_struct *tun) +static inline bool tun_legacy_is_little_endian(unsigned int flags) { bool be =3D IS_ENABLED(CONFIG_TUN_VNET_CROSS_LE) && - (tun->flags & TUN_VNET_BE); + (flags & TUN_VNET_BE); =20 return !be && virtio_legacy_is_little_endian(); } =20 -static long tun_get_vnet_be(struct tun_struct *tun, int __user *argp) +static long tun_get_vnet_be(unsigned int flags, int __user *argp) { - int be =3D !!(tun->flags & TUN_VNET_BE); + int be =3D !!(flags & TUN_VNET_BE); =20 if (!IS_ENABLED(CONFIG_TUN_VNET_CROSS_LE)) return -EINVAL; @@ -319,7 +319,7 @@ static long tun_get_vnet_be(struct tun_struct *tun, int= __user *argp) return 0; } =20 -static long tun_set_vnet_be(struct tun_struct *tun, int __user *argp) +static long tun_set_vnet_be(unsigned int *flags, int __user *argp) { int be; =20 @@ -330,27 +330,26 @@ static long tun_set_vnet_be(struct tun_struct *tun, i= nt __user *argp) return -EFAULT; =20 if (be) - tun->flags |=3D TUN_VNET_BE; + *flags |=3D TUN_VNET_BE; else - tun->flags &=3D ~TUN_VNET_BE; + *flags &=3D ~TUN_VNET_BE; =20 return 0; } =20 -static inline bool tun_is_little_endian(struct tun_struct *tun) +static inline bool tun_is_little_endian(unsigned int flags) { - return tun->flags & TUN_VNET_LE || - tun_legacy_is_little_endian(tun); + return flags & TUN_VNET_LE || tun_legacy_is_little_endian(flags); } =20 -static inline u16 tun16_to_cpu(struct tun_struct *tun, __virtio16 val) +static inline u16 tun16_to_cpu(unsigned int flags, __virtio16 val) { - return __virtio16_to_cpu(tun_is_little_endian(tun), val); + return __virtio16_to_cpu(tun_is_little_endian(flags), val); } =20 -static inline __virtio16 cpu_to_tun16(struct tun_struct *tun, u16 val) +static inline __virtio16 cpu_to_tun16(unsigned int flags, u16 val) { - return __cpu_to_virtio16(tun_is_little_endian(tun), val); + return __cpu_to_virtio16(tun_is_little_endian(flags), val); } =20 static inline u32 tun_hashfn(u32 rxhash) @@ -1766,6 +1765,7 @@ static ssize_t tun_get_user(struct tun_struct *tun, s= truct tun_file *tfile, =20 if (tun->flags & IFF_VNET_HDR) { int vnet_hdr_sz =3D READ_ONCE(tun->vnet_hdr_sz); + int flags =3D tun->flags; =20 if (len < vnet_hdr_sz) return -EINVAL; @@ -1774,11 +1774,11 @@ static ssize_t tun_get_user(struct tun_struct *tun,= struct tun_file *tfile, if (!copy_from_iter_full(&gso, sizeof(gso), from)) return -EFAULT; =20 - hdr_len =3D tun16_to_cpu(tun, gso.hdr_len); + hdr_len =3D tun16_to_cpu(flags, gso.hdr_len); =20 if (gso.flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) { - hdr_len =3D max(tun16_to_cpu(tun, gso.csum_start) + tun16_to_cpu(tun, g= so.csum_offset) + 2, hdr_len); - gso.hdr_len =3D cpu_to_tun16(tun, hdr_len); + hdr_len =3D max(tun16_to_cpu(flags, gso.csum_start) + tun16_to_cpu(flag= s, gso.csum_offset) + 2, hdr_len); + gso.hdr_len =3D cpu_to_tun16(flags, hdr_len); } =20 if (hdr_len > len) @@ -1857,7 +1857,7 @@ static ssize_t tun_get_user(struct tun_struct *tun, s= truct tun_file *tfile, } } =20 - if (virtio_net_hdr_to_skb(skb, &gso, tun_is_little_endian(tun))) { + if (virtio_net_hdr_to_skb(skb, &gso, tun_is_little_endian(tun->flags))) { atomic_long_inc(&tun->rx_frame_errors); err =3D -EINVAL; goto free_skb; @@ -2111,23 +2111,24 @@ static ssize_t tun_put_user(struct tun_struct *tun, =20 if (vnet_hdr_sz) { struct virtio_net_hdr gso; + int flags =3D tun->flags; =20 if (iov_iter_count(iter) < vnet_hdr_sz) return -EINVAL; =20 if (virtio_net_hdr_from_skb(skb, &gso, - tun_is_little_endian(tun), true, + tun_is_little_endian(flags), true, vlan_hlen)) { struct skb_shared_info *sinfo =3D skb_shinfo(skb); =20 if (net_ratelimit()) { netdev_err(tun->dev, "unexpected GSO type: 0x%x, gso_size %d, hdr_len = %d\n", - sinfo->gso_type, tun16_to_cpu(tun, gso.gso_size), - tun16_to_cpu(tun, gso.hdr_len)); + sinfo->gso_type, tun16_to_cpu(flags, gso.gso_size), + tun16_to_cpu(flags, gso.hdr_len)); print_hex_dump(KERN_ERR, "tun: ", DUMP_PREFIX_NONE, 16, 1, skb->head, - min((int)tun16_to_cpu(tun, gso.hdr_len), 64), true); + min((int)tun16_to_cpu(flags, gso.hdr_len), 64), true); } WARN_ON_ONCE(1); return -EINVAL; @@ -2496,7 +2497,7 @@ static int tun_xdp_one(struct tun_struct *tun, skb_reserve(skb, xdp->data - xdp->data_hard_start); skb_put(skb, xdp->data_end - xdp->data); =20 - if (virtio_net_hdr_to_skb(skb, gso, tun_is_little_endian(tun))) { + if (virtio_net_hdr_to_skb(skb, gso, tun_is_little_endian(tun->flags))) { atomic_long_inc(&tun->rx_frame_errors); kfree_skb(skb); ret =3D -EINVAL; @@ -3325,11 +3326,11 @@ static long __tun_chr_ioctl(struct file *file, unsi= gned int cmd, break; =20 case TUNGETVNETBE: - ret =3D tun_get_vnet_be(tun, argp); + ret =3D tun_get_vnet_be(tun->flags, argp); break; =20 case TUNSETVNETBE: - ret =3D tun_set_vnet_be(tun, argp); + ret =3D tun_set_vnet_be(&tun->flags, argp); break; =20 case TUNATTACHFILTER: --=20 2.48.1 From nobody Sun Dec 14 13:56:09 2025 Received: from mail-pl1-f170.google.com (mail-pl1-f170.google.com [209.85.214.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 14AF0233D85 for ; Fri, 7 Feb 2025 06:11:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738908693; cv=none; b=PS4VF9LC7+IzT75tt1IZItICPwVXvZTesMrq/9OLv5IT2+TJ98gYwDaz9p+bwNXaUVaYFhcAlIVQCxqwGR8Gk7E/rXCIucwa1EJQVR2Gi1LWsyfOhJy0PaOJa9oVLzDnJ0zy0sJnE3cOBa+PelJrusV1PWHmzzHRIfqelx/cfWA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738908693; c=relaxed/simple; bh=14P4miNDa9H6HIf6vY14ANPJygZ9JM6cwyTT54tjwx0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=obYcIzzArhlyFeIbEeSSZx/qoihcCqymPM6yuBHSRDbVDXTE9n9vx3RRxVIAxxzXiUolot4HdzfL1zQsxDhGS2VuKOL+h0BvqL8UzjVdaR3wWAB9ImZj0fXJ2wXuJcTu9jhsfn+9SxwHcceir3NfRMzwyniyHdbhYkqHozAyUqE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=daynix.com; spf=pass smtp.mailfrom=daynix.com; dkim=pass (2048-bit key) header.d=daynix-com.20230601.gappssmtp.com header.i=@daynix-com.20230601.gappssmtp.com header.b=ws4kaxpv; arc=none smtp.client-ip=209.85.214.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=daynix.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=daynix.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=daynix-com.20230601.gappssmtp.com header.i=@daynix-com.20230601.gappssmtp.com header.b="ws4kaxpv" Received: by mail-pl1-f170.google.com with SMTP id d9443c01a7336-21f2f09865bso31429355ad.0 for ; Thu, 06 Feb 2025 22:11:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=daynix-com.20230601.gappssmtp.com; s=20230601; t=1738908691; x=1739513491; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=ryfdrY9lKc9aI6OIx44cHyHYp5a4chMvNjG7SkF+UUY=; b=ws4kaxpv6WNRak4Ix9gljrD/OWm3v1I977bmuP0JZasA08UmhY0Iwu0tQI47Ob2bP+ bh+pKmIKUev6s4eJyNTxADDh0wwsXe3Vu59ASOkJAycDLFsEqdg3XBy76pwQQFHRAiv6 XAXFa092g/n5rGp++D9grQfRomo2YCoWIqCOw6nqP8dqOyo9z/YR6GnqG7BYWNK8uU8E Fy0wvV6d6iHPUB4bTbQYRVTJ8N4E8kYS9k+GabmG2TmlwDdcWFR+Z0qvGjq1rjBYSCRc pHJE5g/xbW7zg8lm2fqMZcAevBVeF7tZy+VTBdiIVwt8anXwfAVtxR4xXAHjACRGTKkj CQPw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738908691; x=1739513491; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ryfdrY9lKc9aI6OIx44cHyHYp5a4chMvNjG7SkF+UUY=; b=V/7PAL8QAPbKvpYFMoqWukIsG3u62TN8QLAnGZoy+AqiRpLP18HK7Vw05T1M13p9Xs rAAtNAiWbWi1oB8ZWtG+lXvz+alhh6w+nwXal9U2jh7pRGZhVsPMMKd+xWoY6RW0xkh5 MMM9hoN7/uE5niVuZZ8MaAXr9cOT3I3CAXO3KjLA3iOUNRDJAcFJlhJUL9LR609Um4c2 qYAaEfBLWOh95igyNRhDDnn/RPu4s/+ROqaj5Cf5y7uBs+ScayiCj94z44jUVXeiC8ja 6WBaOyKq/W/hptkqq12JMbTdQ+k5w/Oqf25TD6uAqR1cqjKMoRbHwzUSJS8kW3QxgguP wiQA== X-Forwarded-Encrypted: i=1; AJvYcCXUTzRHeIlVllJzdUTx2yT3gyPI/1ViqDKI4gInikCZ7zq72T08M4GO5bSV/3S4iyJEjugQ6VAk3gZSP4M=@vger.kernel.org X-Gm-Message-State: AOJu0YzDsLK1tFUW+s5rRxptBjYJozBb/ahbuvael0BnNcS5y+ypBBo1 BAjYdXfxa+jN761CCfNo0BA9YT82EN5+Njkzs0aCCvk/WAPnQGWcAbsgmRKWpIg= X-Gm-Gg: ASbGnct1VjwmHn4CXCDa/84huGvAYR5vW7E+y6NRk0heXjH9jOaiHPfg4Lq34UGE9ad 0nLqKwZb3zlZBI590z7KaVocicAFk0N0G9J3zo212tQXzwNdQa6HDIQlJ87ihJ50xQCNk+UyVsM jqlorP0byqwDywBMSQbvu+ZuUvFRWcVLck7qD9LiddV/3WsecJGv1bG1TRWTzVQQgd3R9H9ZTof xjgi1o78j4OX5SMt/k1o1OddbtpRW1zEXBq5ffBMeO0KtIs38DS72Z+dH7C64V1k0j7HesTDkX3 nn7oiF1BNc9CQfhFCt4= X-Google-Smtp-Source: AGHT+IEEJYrdib72m4Zd54o8C2PQElqhgx3VdUfzIWfw+vKrrFWoYYZWeaayg47XMVtdM3/Pr5uX8Q== X-Received: by 2002:a05:6a21:3a4a:b0:1ea:f941:8d8e with SMTP id adf61e73a8af0-1ee0539ced6mr2495946637.16.1738908691404; Thu, 06 Feb 2025 22:11:31 -0800 (PST) Received: from localhost ([157.82.205.237]) by smtp.gmail.com with UTF8SMTPSA id d2e1a72fcca58-73048bf1504sm2332362b3a.108.2025.02.06.22.11.25 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 06 Feb 2025 22:11:30 -0800 (PST) From: Akihiko Odaki Date: Fri, 07 Feb 2025 15:10:54 +0900 Subject: [PATCH net-next v6 4/7] tun: Decouple vnet handling Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250207-tun-v6-4-fb49cf8b103e@daynix.com> References: <20250207-tun-v6-0-fb49cf8b103e@daynix.com> In-Reply-To: <20250207-tun-v6-0-fb49cf8b103e@daynix.com> To: Jonathan Corbet , Willem de Bruijn , Jason Wang , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , "Michael S. Tsirkin" , Xuan Zhuo , Shuah Khan , linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, kvm@vger.kernel.org, virtualization@lists.linux-foundation.org, linux-kselftest@vger.kernel.org, Yuri Benditovich , Andrew Melnychenko , Stephen Hemminger , gur.stavi@huawei.com, devel@daynix.com, Akihiko Odaki Cc: Willem de Bruijn X-Mailer: b4 0.14.2 Decouple the vnet handling code so that we can reuse it for tap. Signed-off-by: Akihiko Odaki Reviewed-by: Willem de Bruijn --- drivers/net/tun.c | 237 ++++++++++++++++++++++++++++++++------------------= ---- 1 file changed, 139 insertions(+), 98 deletions(-) diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 28a1af1de9d704ed5cc51aac3d99bc095cb28ba5..a52c5d00e75c28bb1574f07f59b= e9f96702a6f0a 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -352,6 +352,127 @@ static inline __virtio16 cpu_to_tun16(unsigned int fl= ags, u16 val) return __cpu_to_virtio16(tun_is_little_endian(flags), val); } =20 +static long tun_vnet_ioctl(int *vnet_hdr_sz, unsigned int *flags, + unsigned int cmd, int __user *sp) +{ + int s; + + switch (cmd) { + case TUNGETVNETHDRSZ: + s =3D *vnet_hdr_sz; + if (put_user(s, sp)) + return -EFAULT; + return 0; + + case TUNSETVNETHDRSZ: + if (get_user(s, sp)) + return -EFAULT; + if (s < (int)sizeof(struct virtio_net_hdr)) + return -EINVAL; + + *vnet_hdr_sz =3D s; + return 0; + + case TUNGETVNETLE: + s =3D !!(*flags & TUN_VNET_LE); + if (put_user(s, sp)) + return -EFAULT; + return 0; + + case TUNSETVNETLE: + if (get_user(s, sp)) + return -EFAULT; + if (s) + *flags |=3D TUN_VNET_LE; + else + *flags &=3D ~TUN_VNET_LE; + return 0; + + case TUNGETVNETBE: + return tun_get_vnet_be(*flags, sp); + + case TUNSETVNETBE: + return tun_set_vnet_be(flags, sp); + + default: + return -EINVAL; + } +} + +static int tun_vnet_hdr_get(int sz, unsigned int flags, struct iov_iter *f= rom, + struct virtio_net_hdr *hdr) +{ + u16 hdr_len; + + if (iov_iter_count(from) < sz) + return -EINVAL; + + if (!copy_from_iter_full(hdr, sizeof(*hdr), from)) + return -EFAULT; + + hdr_len =3D tun16_to_cpu(flags, hdr->hdr_len); + + if (hdr->flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) { + hdr_len =3D max(tun16_to_cpu(flags, hdr->csum_start) + tun16_to_cpu(flag= s, hdr->csum_offset) + 2, hdr_len); + hdr->hdr_len =3D cpu_to_tun16(flags, hdr_len); + } + + if (hdr_len > iov_iter_count(from)) + return -EINVAL; + + iov_iter_advance(from, sz - sizeof(*hdr)); + + return hdr_len; +} + +static int tun_vnet_hdr_put(int sz, struct iov_iter *iter, + const struct virtio_net_hdr *hdr) +{ + if (unlikely(iov_iter_count(iter) < sz)) + return -EINVAL; + + if (unlikely(copy_to_iter(hdr, sizeof(*hdr), iter) !=3D sizeof(*hdr))) + return -EFAULT; + + iov_iter_advance(iter, sz - sizeof(*hdr)); + + return 0; +} + +static int tun_vnet_hdr_to_skb(unsigned int flags, struct sk_buff *skb, + const struct virtio_net_hdr *hdr) +{ + return virtio_net_hdr_to_skb(skb, hdr, tun_is_little_endian(flags)); +} + +static int tun_vnet_hdr_from_skb(unsigned int flags, + const struct net_device *dev, + const struct sk_buff *skb, + struct virtio_net_hdr *hdr) +{ + int vlan_hlen =3D skb_vlan_tag_present(skb) ? VLAN_HLEN : 0; + + if (virtio_net_hdr_from_skb(skb, hdr, + tun_is_little_endian(flags), true, + vlan_hlen)) { + struct skb_shared_info *sinfo =3D skb_shinfo(skb); + + if (net_ratelimit()) { + netdev_err(dev, "unexpected GSO type: 0x%x, gso_size %d, hdr_len %d\n", + sinfo->gso_type, tun16_to_cpu(flags, hdr->gso_size), + tun16_to_cpu(flags, hdr->hdr_len)); + print_hex_dump(KERN_ERR, "tun: ", + DUMP_PREFIX_NONE, + 16, 1, skb->head, + min(tun16_to_cpu(flags, hdr->hdr_len), 64), true); + } + WARN_ON_ONCE(1); + return -EINVAL; + } + + return 0; +} + static inline u32 tun_hashfn(u32 rxhash) { return rxhash & TUN_MASK_FLOW_ENTRIES; @@ -1765,25 +1886,12 @@ static ssize_t tun_get_user(struct tun_struct *tun,= struct tun_file *tfile, =20 if (tun->flags & IFF_VNET_HDR) { int vnet_hdr_sz =3D READ_ONCE(tun->vnet_hdr_sz); - int flags =3D tun->flags; - - if (len < vnet_hdr_sz) - return -EINVAL; - len -=3D vnet_hdr_sz; - - if (!copy_from_iter_full(&gso, sizeof(gso), from)) - return -EFAULT; - - hdr_len =3D tun16_to_cpu(flags, gso.hdr_len); =20 - if (gso.flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) { - hdr_len =3D max(tun16_to_cpu(flags, gso.csum_start) + tun16_to_cpu(flag= s, gso.csum_offset) + 2, hdr_len); - gso.hdr_len =3D cpu_to_tun16(flags, hdr_len); - } + hdr_len =3D tun_vnet_hdr_get(vnet_hdr_sz, tun->flags, from, &gso); + if (hdr_len < 0) + return hdr_len; =20 - if (hdr_len > len) - return -EINVAL; - iov_iter_advance(from, vnet_hdr_sz - sizeof(gso)); + len -=3D vnet_hdr_sz; } =20 if ((tun->flags & TUN_TYPE_MASK) =3D=3D IFF_TAP) { @@ -1857,7 +1965,7 @@ static ssize_t tun_get_user(struct tun_struct *tun, s= truct tun_file *tfile, } } =20 - if (virtio_net_hdr_to_skb(skb, &gso, tun_is_little_endian(tun->flags))) { + if (tun_vnet_hdr_to_skb(tun->flags, skb, &gso)) { atomic_long_inc(&tun->rx_frame_errors); err =3D -EINVAL; goto free_skb; @@ -2052,18 +2160,15 @@ static ssize_t tun_put_user_xdp(struct tun_struct *= tun, { int vnet_hdr_sz =3D 0; size_t size =3D xdp_frame->len; - size_t ret; + ssize_t ret; =20 if (tun->flags & IFF_VNET_HDR) { struct virtio_net_hdr gso =3D { 0 }; =20 vnet_hdr_sz =3D READ_ONCE(tun->vnet_hdr_sz); - if (unlikely(iov_iter_count(iter) < vnet_hdr_sz)) - return -EINVAL; - if (unlikely(copy_to_iter(&gso, sizeof(gso), iter) !=3D - sizeof(gso))) - return -EFAULT; - iov_iter_advance(iter, vnet_hdr_sz - sizeof(gso)); + ret =3D tun_vnet_hdr_put(vnet_hdr_sz, iter, &gso); + if (ret) + return ret; } =20 ret =3D copy_to_iter(xdp_frame->data, size, iter) + vnet_hdr_sz; @@ -2086,6 +2191,7 @@ static ssize_t tun_put_user(struct tun_struct *tun, int vlan_offset =3D 0; int vlan_hlen =3D 0; int vnet_hdr_sz =3D 0; + int ret; =20 if (skb_vlan_tag_present(skb)) vlan_hlen =3D VLAN_HLEN; @@ -2111,33 +2217,14 @@ static ssize_t tun_put_user(struct tun_struct *tun, =20 if (vnet_hdr_sz) { struct virtio_net_hdr gso; - int flags =3D tun->flags; - - if (iov_iter_count(iter) < vnet_hdr_sz) - return -EINVAL; - - if (virtio_net_hdr_from_skb(skb, &gso, - tun_is_little_endian(flags), true, - vlan_hlen)) { - struct skb_shared_info *sinfo =3D skb_shinfo(skb); - - if (net_ratelimit()) { - netdev_err(tun->dev, "unexpected GSO type: 0x%x, gso_size %d, hdr_len = %d\n", - sinfo->gso_type, tun16_to_cpu(flags, gso.gso_size), - tun16_to_cpu(flags, gso.hdr_len)); - print_hex_dump(KERN_ERR, "tun: ", - DUMP_PREFIX_NONE, - 16, 1, skb->head, - min((int)tun16_to_cpu(flags, gso.hdr_len), 64), true); - } - WARN_ON_ONCE(1); - return -EINVAL; - } =20 - if (copy_to_iter(&gso, sizeof(gso), iter) !=3D sizeof(gso)) - return -EFAULT; + ret =3D tun_vnet_hdr_from_skb(tun->flags, tun->dev, skb, &gso); + if (ret) + return ret; =20 - iov_iter_advance(iter, vnet_hdr_sz - sizeof(gso)); + ret =3D tun_vnet_hdr_put(vnet_hdr_sz, iter, &gso); + if (ret) + return ret; } =20 if (vlan_hlen) { @@ -2497,7 +2584,7 @@ static int tun_xdp_one(struct tun_struct *tun, skb_reserve(skb, xdp->data - xdp->data_hard_start); skb_put(skb, xdp->data_end - xdp->data); =20 - if (virtio_net_hdr_to_skb(skb, gso, tun_is_little_endian(tun->flags))) { + if (tun_vnet_hdr_to_skb(tun->flags, skb, gso)) { atomic_long_inc(&tun->rx_frame_errors); kfree_skb(skb); ret =3D -EINVAL; @@ -3081,8 +3168,6 @@ static long __tun_chr_ioctl(struct file *file, unsign= ed int cmd, kgid_t group; int ifindex; int sndbuf; - int vnet_hdr_sz; - int le; int ret; bool do_notify =3D false; =20 @@ -3289,50 +3374,6 @@ static long __tun_chr_ioctl(struct file *file, unsig= ned int cmd, tun_set_sndbuf(tun); break; =20 - case TUNGETVNETHDRSZ: - vnet_hdr_sz =3D tun->vnet_hdr_sz; - if (copy_to_user(argp, &vnet_hdr_sz, sizeof(vnet_hdr_sz))) - ret =3D -EFAULT; - break; - - case TUNSETVNETHDRSZ: - if (copy_from_user(&vnet_hdr_sz, argp, sizeof(vnet_hdr_sz))) { - ret =3D -EFAULT; - break; - } - if (vnet_hdr_sz < (int)sizeof(struct virtio_net_hdr)) { - ret =3D -EINVAL; - break; - } - - tun->vnet_hdr_sz =3D vnet_hdr_sz; - break; - - case TUNGETVNETLE: - le =3D !!(tun->flags & TUN_VNET_LE); - if (put_user(le, (int __user *)argp)) - ret =3D -EFAULT; - break; - - case TUNSETVNETLE: - if (get_user(le, (int __user *)argp)) { - ret =3D -EFAULT; - break; - } - if (le) - tun->flags |=3D TUN_VNET_LE; - else - tun->flags &=3D ~TUN_VNET_LE; - break; - - case TUNGETVNETBE: - ret =3D tun_get_vnet_be(tun->flags, argp); - break; - - case TUNSETVNETBE: - ret =3D tun_set_vnet_be(&tun->flags, argp); - break; - case TUNATTACHFILTER: /* Can be set only for TAPs */ ret =3D -EINVAL; @@ -3388,7 +3429,7 @@ static long __tun_chr_ioctl(struct file *file, unsign= ed int cmd, break; =20 default: - ret =3D -EINVAL; + ret =3D tun_vnet_ioctl(&tun->vnet_hdr_sz, &tun->flags, cmd, argp); break; } =20 --=20 2.48.1 From nobody Sun Dec 14 13:56:09 2025 Received: from mail-pl1-f178.google.com (mail-pl1-f178.google.com [209.85.214.178]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 155B0233D99 for ; Fri, 7 Feb 2025 06:11:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738908701; cv=none; b=hXaWYkTyxjaqL6x94ROSi0Dxr4qeyRqTmB5/4jVmlMGvA8h0bLE0T4+O/eCqnRbEKPaoL+yiR9PAwGP5uG2fDploxjexluVRkINYMAikITQ2MtLBFYoc9/KBEeVFCSDzRnwstv43QnlPyIfl0KvH4kvy7Yvd+4lQti3loXq0XvU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738908701; c=relaxed/simple; bh=2sT9p7Tdhv7mEmV/c7UEOWKJMAqlEDsJXf98KzxVhec=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To; b=F/6DH3LRBOSmTMyZJ0I1UThockeywxCwkjv6c34RBbc/8YjXBUFQ1dyLesYE61IXp/zBNHDSVbk4Mu9etR7I1JQLSm2nf/cjNe/Eo+cdlqgf7NIJN+mf2fMaPXIzd/d7emQincWJPDwkRyj5JdYAPYuAssKEbiZhiLS1NVfisIM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=daynix.com; spf=pass smtp.mailfrom=daynix.com; dkim=pass (2048-bit key) header.d=daynix-com.20230601.gappssmtp.com header.i=@daynix-com.20230601.gappssmtp.com header.b=tC9gp3DB; arc=none smtp.client-ip=209.85.214.178 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=daynix.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=daynix.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=daynix-com.20230601.gappssmtp.com header.i=@daynix-com.20230601.gappssmtp.com header.b="tC9gp3DB" Received: by mail-pl1-f178.google.com with SMTP id d9443c01a7336-2166651f752so37291275ad.3 for ; Thu, 06 Feb 2025 22:11:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=daynix-com.20230601.gappssmtp.com; s=20230601; t=1738908699; x=1739513499; darn=vger.kernel.org; h=to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=fmnHaYspPDyJkcOuZzaS2LCZdNKiS5G61RIu4vxwt0s=; b=tC9gp3DB02lnSSPF13Z1dAz2R3i7UAdHrepVXPDnkdmot7ab+iWIzM05bhx1s0UUkP Qdl5+P0F1EBg23tDan6Pt5kAFfz8w3N0mdQ+7gmcKo6K8EBhlOgAAPaIn9chgWqDjO2u +qitkfEu3J43wda2e9zTBB52CDWgNYu8DdusNxoEO+K9TwHMgkQjPHiyDVZBWZmjPr0X 6StL6x1TmTOOeKsXVbArTQpfS2iMfSGIevaX1TRczjCQgE94CEcUcqfNXDxy+CXo59GN QTI1hx3l5t1dm1f1R3CiDZlMIvirGsGZljBQEiGJjs8Gonr1uP38Jzp4oh4cIULTjR2k EhJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738908699; x=1739513499; h=to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=fmnHaYspPDyJkcOuZzaS2LCZdNKiS5G61RIu4vxwt0s=; b=a6I9vLhVEdgWXxnMyQEKSC3UO8czr3LmEESp/kbyMQpWuFNTwy/KxmXIZkYtIIKs5i giy29M2W4uImlYVnU9jB033CNDemXnnYHpuuYsX3sauxSTrEavLXHsgN5ccz6bhYie43 arISsdAmX/JIBbBILF1YSqTLWgtVlSgEKKV6RQ+xIFYulDNl7G/7RFmdXf+Ph8TFadmK 5EDfkLe9PTq8aKETd7sa2moqGdnzmeqzaRmLmZtIl2KE+eIkBJ95jFVNTV/2cPVwOLAp DV5MtSRbWZUBSWfYF1H1s7jYJSqxCwz6y4FQhJXsUWflEM9vZp6a7Ecj/9m2RiKHi2kW 19jg== X-Forwarded-Encrypted: i=1; AJvYcCXOGn6Tctixt4qOUtATyHhrkq/fJndCNsUATyt1MRbmmuq5JNh6MmddHV8+b8jle80N8vcm5E46Zw0bJTI=@vger.kernel.org X-Gm-Message-State: AOJu0YzYFxPk9+8RCAb5rGH8WQMNv4p3RGryutIfhk1Xs6zwV61TBIi3 iorQhHWO9jpGyn9OpFtJLYYFLuMIdtpFrt0ntrPoT8VO20xBPm3QQzKBUwSS5LE= X-Gm-Gg: ASbGnctJuo9E284clck4G8iuUKCbKpd606gJHS/LLhQXO3QVsLY9FcO6TIuTdExNp0E C5Et1vrxSXdBWpKOvbzT6tUXPWtkE5mb0Y03CUSEqjybG8wvdPWAlit0lbYjDP1kh8wMhZ6E10c w9svXR3kj9U6N989ql5FSlUKv6pRSXbbp+29hqJ+RoR99OsLFYJ9xnfS5vcBWDvSrZu+p1gga3t SvyGUaF6S+99xjOxAu1mO/ocDO0YG1a27amE/V19+yuXomKtH9JQ/ySaZ7F9OWF25ue16siM4SS TRfA8SKOQTXbZik3KWc= X-Google-Smtp-Source: AGHT+IGDh54iXLRiJ4OMG7YrYR+1P1l3EmrGDIxypvzlptE9odP3bP3T6YgsEKO8xT2k1RC3iKNu2g== X-Received: by 2002:a17:903:41c9:b0:215:5625:885b with SMTP id d9443c01a7336-21f4e7e5f2dmr29039275ad.52.1738908699417; Thu, 06 Feb 2025 22:11:39 -0800 (PST) Received: from localhost ([157.82.205.237]) by smtp.gmail.com with UTF8SMTPSA id 98e67ed59e1d1-2fa184ac945sm1755361a91.46.2025.02.06.22.11.34 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 06 Feb 2025 22:11:39 -0800 (PST) From: Akihiko Odaki Date: Fri, 07 Feb 2025 15:10:55 +0900 Subject: [PATCH net-next v6 5/7] tun: Extract the vnet handling code Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250207-tun-v6-5-fb49cf8b103e@daynix.com> References: <20250207-tun-v6-0-fb49cf8b103e@daynix.com> In-Reply-To: <20250207-tun-v6-0-fb49cf8b103e@daynix.com> To: Jonathan Corbet , Willem de Bruijn , Jason Wang , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , "Michael S. Tsirkin" , Xuan Zhuo , Shuah Khan , linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, kvm@vger.kernel.org, virtualization@lists.linux-foundation.org, linux-kselftest@vger.kernel.org, Yuri Benditovich , Andrew Melnychenko , Stephen Hemminger , gur.stavi@huawei.com, devel@daynix.com, Akihiko Odaki X-Mailer: b4 0.14.2 The vnet handling code will be reused by tap. Functions are renamed to ensure that their names contain "vnet" to clarify that they are part of the decoupled vnet handling code. Signed-off-by: Akihiko Odaki --- MAINTAINERS | 2 +- drivers/net/tun.c | 180 +--------------------------------------------= -- drivers/net/tun_vnet.h | 185 +++++++++++++++++++++++++++++++++++++++++++++= ++++ 3 files changed, 188 insertions(+), 179 deletions(-) diff --git a/MAINTAINERS b/MAINTAINERS index 910305c11e8a882da5b49ce5bd55011b93f28c32..bc32b7e23c79ab80b19c8207f14= c5e51a47ec89f 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -23902,7 +23902,7 @@ W: http://vtun.sourceforge.net/tun F: Documentation/networking/tuntap.rst F: arch/um/os-Linux/drivers/ F: drivers/net/tap.c -F: drivers/net/tun.c +F: drivers/net/tun* =20 TURBOCHANNEL SUBSYSTEM M: "Maciej W. Rozycki" diff --git a/drivers/net/tun.c b/drivers/net/tun.c index a52c5d00e75c28bb1574f07f59be9f96702a6f0a..b14231a743915c2851eaae49d75= 7b763ec4a8841 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -83,6 +83,8 @@ #include #include =20 +#include "tun_vnet.h" + static void tun_default_link_ksettings(struct net_device *dev, struct ethtool_link_ksettings *cmd); =20 @@ -94,9 +96,6 @@ static void tun_default_link_ksettings(struct net_device = *dev, * overload it to mean fasync when stored there. */ #define TUN_FASYNC IFF_ATTACH_QUEUE -/* High bits in flags field are unused. */ -#define TUN_VNET_LE 0x80000000 -#define TUN_VNET_BE 0x40000000 =20 #define TUN_FEATURES (IFF_NO_PI | IFF_ONE_QUEUE | IFF_VNET_HDR | \ IFF_MULTI_QUEUE | IFF_NAPI | IFF_NAPI_FRAGS) @@ -298,181 +297,6 @@ static bool tun_napi_frags_enabled(const struct tun_f= ile *tfile) return tfile->napi_frags_enabled; } =20 -static inline bool tun_legacy_is_little_endian(unsigned int flags) -{ - bool be =3D IS_ENABLED(CONFIG_TUN_VNET_CROSS_LE) && - (flags & TUN_VNET_BE); - - return !be && virtio_legacy_is_little_endian(); -} - -static long tun_get_vnet_be(unsigned int flags, int __user *argp) -{ - int be =3D !!(flags & TUN_VNET_BE); - - if (!IS_ENABLED(CONFIG_TUN_VNET_CROSS_LE)) - return -EINVAL; - - if (put_user(be, argp)) - return -EFAULT; - - return 0; -} - -static long tun_set_vnet_be(unsigned int *flags, int __user *argp) -{ - int be; - - if (!IS_ENABLED(CONFIG_TUN_VNET_CROSS_LE)) - return -EINVAL; - - if (get_user(be, argp)) - return -EFAULT; - - if (be) - *flags |=3D TUN_VNET_BE; - else - *flags &=3D ~TUN_VNET_BE; - - return 0; -} - -static inline bool tun_is_little_endian(unsigned int flags) -{ - return flags & TUN_VNET_LE || tun_legacy_is_little_endian(flags); -} - -static inline u16 tun16_to_cpu(unsigned int flags, __virtio16 val) -{ - return __virtio16_to_cpu(tun_is_little_endian(flags), val); -} - -static inline __virtio16 cpu_to_tun16(unsigned int flags, u16 val) -{ - return __cpu_to_virtio16(tun_is_little_endian(flags), val); -} - -static long tun_vnet_ioctl(int *vnet_hdr_sz, unsigned int *flags, - unsigned int cmd, int __user *sp) -{ - int s; - - switch (cmd) { - case TUNGETVNETHDRSZ: - s =3D *vnet_hdr_sz; - if (put_user(s, sp)) - return -EFAULT; - return 0; - - case TUNSETVNETHDRSZ: - if (get_user(s, sp)) - return -EFAULT; - if (s < (int)sizeof(struct virtio_net_hdr)) - return -EINVAL; - - *vnet_hdr_sz =3D s; - return 0; - - case TUNGETVNETLE: - s =3D !!(*flags & TUN_VNET_LE); - if (put_user(s, sp)) - return -EFAULT; - return 0; - - case TUNSETVNETLE: - if (get_user(s, sp)) - return -EFAULT; - if (s) - *flags |=3D TUN_VNET_LE; - else - *flags &=3D ~TUN_VNET_LE; - return 0; - - case TUNGETVNETBE: - return tun_get_vnet_be(*flags, sp); - - case TUNSETVNETBE: - return tun_set_vnet_be(flags, sp); - - default: - return -EINVAL; - } -} - -static int tun_vnet_hdr_get(int sz, unsigned int flags, struct iov_iter *f= rom, - struct virtio_net_hdr *hdr) -{ - u16 hdr_len; - - if (iov_iter_count(from) < sz) - return -EINVAL; - - if (!copy_from_iter_full(hdr, sizeof(*hdr), from)) - return -EFAULT; - - hdr_len =3D tun16_to_cpu(flags, hdr->hdr_len); - - if (hdr->flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) { - hdr_len =3D max(tun16_to_cpu(flags, hdr->csum_start) + tun16_to_cpu(flag= s, hdr->csum_offset) + 2, hdr_len); - hdr->hdr_len =3D cpu_to_tun16(flags, hdr_len); - } - - if (hdr_len > iov_iter_count(from)) - return -EINVAL; - - iov_iter_advance(from, sz - sizeof(*hdr)); - - return hdr_len; -} - -static int tun_vnet_hdr_put(int sz, struct iov_iter *iter, - const struct virtio_net_hdr *hdr) -{ - if (unlikely(iov_iter_count(iter) < sz)) - return -EINVAL; - - if (unlikely(copy_to_iter(hdr, sizeof(*hdr), iter) !=3D sizeof(*hdr))) - return -EFAULT; - - iov_iter_advance(iter, sz - sizeof(*hdr)); - - return 0; -} - -static int tun_vnet_hdr_to_skb(unsigned int flags, struct sk_buff *skb, - const struct virtio_net_hdr *hdr) -{ - return virtio_net_hdr_to_skb(skb, hdr, tun_is_little_endian(flags)); -} - -static int tun_vnet_hdr_from_skb(unsigned int flags, - const struct net_device *dev, - const struct sk_buff *skb, - struct virtio_net_hdr *hdr) -{ - int vlan_hlen =3D skb_vlan_tag_present(skb) ? VLAN_HLEN : 0; - - if (virtio_net_hdr_from_skb(skb, hdr, - tun_is_little_endian(flags), true, - vlan_hlen)) { - struct skb_shared_info *sinfo =3D skb_shinfo(skb); - - if (net_ratelimit()) { - netdev_err(dev, "unexpected GSO type: 0x%x, gso_size %d, hdr_len %d\n", - sinfo->gso_type, tun16_to_cpu(flags, hdr->gso_size), - tun16_to_cpu(flags, hdr->hdr_len)); - print_hex_dump(KERN_ERR, "tun: ", - DUMP_PREFIX_NONE, - 16, 1, skb->head, - min(tun16_to_cpu(flags, hdr->hdr_len), 64), true); - } - WARN_ON_ONCE(1); - return -EINVAL; - } - - return 0; -} - static inline u32 tun_hashfn(u32 rxhash) { return rxhash & TUN_MASK_FLOW_ENTRIES; diff --git a/drivers/net/tun_vnet.h b/drivers/net/tun_vnet.h new file mode 100644 index 0000000000000000000000000000000000000000..fd7411c4447ffb180e032fe3e22= f6709c30da8e9 --- /dev/null +++ b/drivers/net/tun_vnet.h @@ -0,0 +1,185 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +#ifndef TUN_VNET_H +#define TUN_VNET_H + +/* High bits in flags field are unused. */ +#define TUN_VNET_LE 0x80000000 +#define TUN_VNET_BE 0x40000000 + +static inline bool tun_vnet_legacy_is_little_endian(unsigned int flags) +{ + bool be =3D IS_ENABLED(CONFIG_TUN_VNET_CROSS_LE) && + (flags & TUN_VNET_BE); + + return !be && virtio_legacy_is_little_endian(); +} + +static inline long tun_get_vnet_be(unsigned int flags, int __user *argp) +{ + int be =3D !!(flags & TUN_VNET_BE); + + if (!IS_ENABLED(CONFIG_TUN_VNET_CROSS_LE)) + return -EINVAL; + + if (put_user(be, argp)) + return -EFAULT; + + return 0; +} + +static inline long tun_set_vnet_be(unsigned int *flags, int __user *argp) +{ + int be; + + if (!IS_ENABLED(CONFIG_TUN_VNET_CROSS_LE)) + return -EINVAL; + + if (get_user(be, argp)) + return -EFAULT; + + if (be) + *flags |=3D TUN_VNET_BE; + else + *flags &=3D ~TUN_VNET_BE; + + return 0; +} + +static inline bool tun_vnet_is_little_endian(unsigned int flags) +{ + return flags & TUN_VNET_LE || tun_vnet_legacy_is_little_endian(flags); +} + +static inline u16 tun_vnet16_to_cpu(unsigned int flags, __virtio16 val) +{ + return __virtio16_to_cpu(tun_vnet_is_little_endian(flags), val); +} + +static inline __virtio16 cpu_to_tun_vnet16(unsigned int flags, u16 val) +{ + return __cpu_to_virtio16(tun_vnet_is_little_endian(flags), val); +} + +static inline long tun_vnet_ioctl(int *vnet_hdr_sz, unsigned int *flags, + unsigned int cmd, int __user *sp) +{ + int s; + + switch (cmd) { + case TUNGETVNETHDRSZ: + s =3D *vnet_hdr_sz; + if (put_user(s, sp)) + return -EFAULT; + return 0; + + case TUNSETVNETHDRSZ: + if (get_user(s, sp)) + return -EFAULT; + if (s < (int)sizeof(struct virtio_net_hdr)) + return -EINVAL; + + *vnet_hdr_sz =3D s; + return 0; + + case TUNGETVNETLE: + s =3D !!(*flags & TUN_VNET_LE); + if (put_user(s, sp)) + return -EFAULT; + return 0; + + case TUNSETVNETLE: + if (get_user(s, sp)) + return -EFAULT; + if (s) + *flags |=3D TUN_VNET_LE; + else + *flags &=3D ~TUN_VNET_LE; + return 0; + + case TUNGETVNETBE: + return tun_get_vnet_be(*flags, sp); + + case TUNSETVNETBE: + return tun_set_vnet_be(flags, sp); + + default: + return -EINVAL; + } +} + +static inline int tun_vnet_hdr_get(int sz, unsigned int flags, + struct iov_iter *from, + struct virtio_net_hdr *hdr) +{ + u16 hdr_len; + + if (iov_iter_count(from) < sz) + return -EINVAL; + + if (!copy_from_iter_full(hdr, sizeof(*hdr), from)) + return -EFAULT; + + hdr_len =3D tun_vnet16_to_cpu(flags, hdr->hdr_len); + + if (hdr->flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) { + hdr_len =3D max(tun_vnet16_to_cpu(flags, hdr->csum_start) + tun_vnet16_t= o_cpu(flags, hdr->csum_offset) + 2, hdr_len); + hdr->hdr_len =3D cpu_to_tun_vnet16(flags, hdr_len); + } + + if (hdr_len > iov_iter_count(from)) + return -EINVAL; + + iov_iter_advance(from, sz - sizeof(*hdr)); + + return hdr_len; +} + +static inline int tun_vnet_hdr_put(int sz, struct iov_iter *iter, + const struct virtio_net_hdr *hdr) +{ + if (unlikely(iov_iter_count(iter) < sz)) + return -EINVAL; + + if (unlikely(copy_to_iter(hdr, sizeof(*hdr), iter) !=3D sizeof(*hdr))) + return -EFAULT; + + iov_iter_advance(iter, sz - sizeof(*hdr)); + + return 0; +} + +static inline int tun_vnet_hdr_to_skb(unsigned int flags, struct sk_buff *= skb, + const struct virtio_net_hdr *hdr) +{ + return virtio_net_hdr_to_skb(skb, hdr, tun_vnet_is_little_endian(flags)); +} + +static inline int tun_vnet_hdr_from_skb(unsigned int flags, + const struct net_device *dev, + const struct sk_buff *skb, + struct virtio_net_hdr *hdr) +{ + int vlan_hlen =3D skb_vlan_tag_present(skb) ? VLAN_HLEN : 0; + + if (virtio_net_hdr_from_skb(skb, hdr, + tun_vnet_is_little_endian(flags), true, + vlan_hlen)) { + struct skb_shared_info *sinfo =3D skb_shinfo(skb); + + if (net_ratelimit()) { + netdev_err(dev, "unexpected GSO type: 0x%x, gso_size %d, hdr_len %d\n", + sinfo->gso_type, tun_vnet16_to_cpu(flags, hdr->gso_size), + tun_vnet16_to_cpu(flags, hdr->hdr_len)); + print_hex_dump(KERN_ERR, "tun: ", + DUMP_PREFIX_NONE, + 16, 1, skb->head, + min(tun_vnet16_to_cpu(flags, hdr->hdr_len), 64), true); + } + WARN_ON_ONCE(1); + return -EINVAL; + } + + return 0; +} + +#endif /* TUN_VNET_H */ --=20 2.48.1 From nobody Sun Dec 14 13:56:09 2025 Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 501ED2343C0 for ; Fri, 7 Feb 2025 06:11:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738908709; cv=none; b=mpZSdfwJ53RYqOPgPRKcDV3830AxGL1MZk/T2+6fznyUhh580H69u9A4aZKhASK+SSYdgNjtT5Hv2qqpq3JOEtqmgsz5cmrzQ+iHfZ6vrPFBelXjYR/Mx7VzKOLtR/UQ8KFZQeOYqFxCbotg8u3/EwAvC47imsAgk54kE/6jl4Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738908709; c=relaxed/simple; bh=nZIPHAA5zCJF7swo3jDQ5RjM5zm8qMnIWTvWpC5hGqc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To; b=STFyALnQS3jtumWf9jX+iBE8RX3gs0PuXcQ+Ut8rIoNphhw5JwTd0LPWnLREkN1rogVwCCjSH8eAFT4RG19rnQisrFt6DryP98GAGZwIW3xFAFkaeAyznOf1nSe9977ra5WFuY0cUfa+bi2fevvJslweMKQJI9o9npv54XeRGoM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=daynix.com; spf=pass smtp.mailfrom=daynix.com; dkim=pass (2048-bit key) header.d=daynix-com.20230601.gappssmtp.com header.i=@daynix-com.20230601.gappssmtp.com header.b=Z0GEn7oy; arc=none smtp.client-ip=209.85.214.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=daynix.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=daynix.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=daynix-com.20230601.gappssmtp.com header.i=@daynix-com.20230601.gappssmtp.com header.b="Z0GEn7oy" Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-21f20666e72so35860805ad.1 for ; Thu, 06 Feb 2025 22:11:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=daynix-com.20230601.gappssmtp.com; s=20230601; t=1738908706; x=1739513506; darn=vger.kernel.org; h=to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=4saBNfFGUdtw4heVChkMZd5FykA/GmW9Q/kNvdZqu3c=; b=Z0GEn7oy7nAcn8Yimse7BALKQCW7fwCtEHPpVzB75/3hagaW8sbuotM6pf9VTPzKxm 8YOh1fsHuReQ7Hg1hbHHZdmmxeBYSabo8pZIybqalOsotkukqeA+HdwBfLvsxHBdVDmE HyyNUrEXj9S23lDnsLWSVGx8ZiNlizamy2aimhQpG6N7KEV6823+Lv7a0CjdBU1qHGLz w5RuidjRpVdKKgUMSAFsqKdYK9d/rJ2Vip217r7XBVy/itv12JYi2fCbDAPM79/ca+oq gLRoHaB197upoPkuygc+o+3JjH7iiRT4nIk6BUatpgXEPg1nA93NfyW+gtONycwPfYTq LG5w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738908706; x=1739513506; h=to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=4saBNfFGUdtw4heVChkMZd5FykA/GmW9Q/kNvdZqu3c=; b=odZLnXJLFpexx9OF17ATHSQOs3QiiB0xhtiw5DwdTPPxgT8bh3cpLYUmF4qwFtCA/k wfpEr166YqPV3OBndhlwx29CdHS9BPGHkdqsfqJbgTxpEtDULgvN+601XtNeYhNQ/KRD Teb3dhHGQx3/xF6ZncCawvjZzHxr6SoLWuQxn4OhBmAZgzMgnNAl3SvmG3fRt+HJ6sbx DAK/ExVlTfCbu1tMDdt9DjvK94Q93PpdLJahhcm7kyhu6S/C2YBc2+ysfZdCH2zYK2+I esnTp1XpJCB52lqDsP566wQr8gcyA8Y5QP7nfx3f3R5eEJlS0oL8lAio4ZAKiVcfYO62 K/cw== X-Forwarded-Encrypted: i=1; AJvYcCU4dWIEqEsfh7d4w48glu/dBmlNgfL389p06UwttflbjiMGNJZYKLX9NaWsy/CnjBSS/1V+Xg3V1Gol8ek=@vger.kernel.org X-Gm-Message-State: AOJu0Yzuc1J3N7A0+EoExxhL5C5URu7kbvw6uCU98tyzb7TFUXY4WNFc l7qVb+OmiJzPAhMfzAV11LKd0hX+8ajrykHBNwhEM6MyHA/GSqesjY0vD3bq+kQ= X-Gm-Gg: ASbGncsfuSBLztidYjj/saJdXSH4LY46DKMVfajWxjfyT3i6w73blAjU5rgSvEzN0cA XHkdJJvRW2oKCUKKnsGTGHwH2QGamjU126/O9zdUN/wAmNvvtA30K6lR3Q5RJ/4Lg4UzFQ65kgY 2OdyVuXG8LHydh+ergCwPp+B5pMlJsl5xk/nFLGIYsds0cSOv+Zdf/Dk4dcJEMfHLczQL8W7uYO dLXpNAZuItvpcPatH35+7knI2dEb2Q4jy6Ch+DTE1BOgX1CIVg8lTrfBtfVlF3SHCtoM3olrjHA O9xHLu2bG1s5ckY6YEQ= X-Google-Smtp-Source: AGHT+IES1fBH9Xm1hn7eMcWgU4qwNM0YJ/XgnSVms60Xt5aaLNJShgX4JEQoDPxBZLAVM7x/w27pJw== X-Received: by 2002:a17:902:d502:b0:21c:15b3:e3a8 with SMTP id d9443c01a7336-21f4e7636d6mr31492145ad.37.1738908706650; Thu, 06 Feb 2025 22:11:46 -0800 (PST) Received: from localhost ([157.82.205.237]) by smtp.gmail.com with UTF8SMTPSA id d9443c01a7336-21f3650cd10sm22742625ad.31.2025.02.06.22.11.41 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 06 Feb 2025 22:11:46 -0800 (PST) From: Akihiko Odaki Date: Fri, 07 Feb 2025 15:10:56 +0900 Subject: [PATCH net-next v6 6/7] tap: Keep hdr_len in tap_get_user() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250207-tun-v6-6-fb49cf8b103e@daynix.com> References: <20250207-tun-v6-0-fb49cf8b103e@daynix.com> In-Reply-To: <20250207-tun-v6-0-fb49cf8b103e@daynix.com> To: Jonathan Corbet , Willem de Bruijn , Jason Wang , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , "Michael S. Tsirkin" , Xuan Zhuo , Shuah Khan , linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, kvm@vger.kernel.org, virtualization@lists.linux-foundation.org, linux-kselftest@vger.kernel.org, Yuri Benditovich , Andrew Melnychenko , Stephen Hemminger , gur.stavi@huawei.com, devel@daynix.com, Akihiko Odaki X-Mailer: b4 0.14.2 hdr_len is repeatedly used so keep it in a local variable. Signed-off-by: Akihiko Odaki --- drivers/net/tap.c | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/drivers/net/tap.c b/drivers/net/tap.c index 5aa41d5f7765a6dcf185bccd3cba2299bad89398..8cb002616a6143b54258b65b483= fed0c3af2c7a0 100644 --- a/drivers/net/tap.c +++ b/drivers/net/tap.c @@ -645,6 +645,7 @@ static ssize_t tap_get_user(struct tap_queue *q, void *= msg_control, int err; struct virtio_net_hdr vnet_hdr =3D { 0 }; int vnet_hdr_len =3D 0; + int hdr_len =3D 0; int copylen =3D 0; int depth; bool zerocopy =3D false; @@ -663,13 +664,13 @@ static ssize_t tap_get_user(struct tap_queue *q, void= *msg_control, if (!copy_from_iter_full(&vnet_hdr, sizeof(vnet_hdr), from)) goto err; iov_iter_advance(from, vnet_hdr_len - sizeof(vnet_hdr)); - if ((vnet_hdr.flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) && - tap16_to_cpu(q, vnet_hdr.csum_start) + - tap16_to_cpu(q, vnet_hdr.csum_offset) + 2 > - tap16_to_cpu(q, vnet_hdr.hdr_len)) - vnet_hdr.hdr_len =3D cpu_to_tap16(q, - tap16_to_cpu(q, vnet_hdr.csum_start) + - tap16_to_cpu(q, vnet_hdr.csum_offset) + 2); + hdr_len =3D tap16_to_cpu(q, vnet_hdr.hdr_len); + if (vnet_hdr.flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) { + hdr_len =3D max(tap16_to_cpu(q, vnet_hdr.csum_start) + + tap16_to_cpu(q, vnet_hdr.csum_offset) + 2, + hdr_len); + vnet_hdr.hdr_len =3D cpu_to_tap16(q, hdr_len); + } err =3D -EINVAL; if (tap16_to_cpu(q, vnet_hdr.hdr_len) > len) goto err; @@ -682,12 +683,7 @@ static ssize_t tap_get_user(struct tap_queue *q, void = *msg_control, if (msg_control && sock_flag(&q->sk, SOCK_ZEROCOPY)) { struct iov_iter i; =20 - copylen =3D vnet_hdr.hdr_len ? - tap16_to_cpu(q, vnet_hdr.hdr_len) : GOODCOPY_LEN; - if (copylen > good_linear) - copylen =3D good_linear; - else if (copylen < ETH_HLEN) - copylen =3D ETH_HLEN; + copylen =3D clamp(hdr_len ?: GOODCOPY_LEN, ETH_HLEN, good_linear); linear =3D copylen; i =3D *from; iov_iter_advance(&i, copylen); @@ -697,11 +693,7 @@ static ssize_t tap_get_user(struct tap_queue *q, void = *msg_control, =20 if (!zerocopy) { copylen =3D len; - linear =3D tap16_to_cpu(q, vnet_hdr.hdr_len); - if (linear > good_linear) - linear =3D good_linear; - else if (linear < ETH_HLEN) - linear =3D ETH_HLEN; + linear =3D clamp(hdr_len, ETH_HLEN, good_linear); } =20 skb =3D tap_alloc_skb(&q->sk, TAP_RESERVE, copylen, --=20 2.48.1 From nobody Sun Dec 14 13:56:09 2025 Received: from mail-pl1-f173.google.com (mail-pl1-f173.google.com [209.85.214.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E0FF72376E7 for ; Fri, 7 Feb 2025 06:11:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738908717; cv=none; b=PbcO/iU7c6dX1CaGwvTqmyEpjEBmhj1x/JWFpKavQIIvP7hFtm8wZQyop4ORm3oqNtgtRW7ZTvOuTq/UyJSrFInvV4URwkRccqfoBrxQscfkdF62R5Y3uSqir0DHTlvkdNTi1gb0ThZnLNgW1vJBVTjzESAD2HF8WcLhnTHhs1Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738908717; c=relaxed/simple; bh=HTscNvyC9HJMHKWPJX1Sejy7f+gI0K4OIXa4+ZNvbAw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=k5LgLoDO+OF/YALWfy/cOulYH76Z6q7XxAZfpMG2DQVY3SzhoXL/sGJrBSFCF9CUC070+cTjDjMpAtc5B7aesd4KwrUoW7aUfvI0hzRnXTZJc/wkoaD9pUDBD8sXaCEtHuozI+icVUobXYPwI8U5PDj/K2WKcuMO8b8jRKDd2ik= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=daynix.com; spf=pass smtp.mailfrom=daynix.com; dkim=pass (2048-bit key) header.d=daynix-com.20230601.gappssmtp.com header.i=@daynix-com.20230601.gappssmtp.com header.b=AYoCJndz; arc=none smtp.client-ip=209.85.214.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=daynix.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=daynix.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=daynix-com.20230601.gappssmtp.com header.i=@daynix-com.20230601.gappssmtp.com header.b="AYoCJndz" Received: by mail-pl1-f173.google.com with SMTP id d9443c01a7336-2165448243fso42223895ad.1 for ; Thu, 06 Feb 2025 22:11:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=daynix-com.20230601.gappssmtp.com; s=20230601; t=1738908714; x=1739513514; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=S+R57A+roDGJE2oJSDUQxgir3uIkoZEEbg7sX8hwWCo=; b=AYoCJndzxK0AsVqnRxIT8ZCSF0ko1nWeMW2iL8QdIDS3H5F26eZIk18IuZ2RLuArmm kdOtqUKzdVqNl1/V2cyNB3UDo8vBL8dWk1EtEYhdDQTUS06YlId1KSMQYweXxoKqcM2E GX26Znx17apatzBLvLhAdnSrp1PG3ovkf2IjmW96UtoiDbWDhKAPeONF00O4nj34EzOu K/lZATUrdaWDmMor4+oKnOJdFs+oc9i15JNMy6W+XJdQKev6tsVhg7bfSCkT0CNl800l 7UskWins2NHc83WIMykZwE2fiwDlqFfrxWIaQWu79V3FCrQLh7IrA7ftjkSAMMhJPbDG RcPw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738908714; x=1739513514; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=S+R57A+roDGJE2oJSDUQxgir3uIkoZEEbg7sX8hwWCo=; b=NikcwIoYL6EVZGDLHnPjGxFrzA6uNSqwUKccIuFgwuU+1kEnwgnvyH7sBLNQMl7cjN 9yepZg0CdSAOV44L6XXCqGqR4dz7aTTx7tfDIF+fDteiAW/EbdK76xnuxmd1iDs3PpXv 8rg67axdzCUzzbSICGecuaHRskFDhMJAOvpVcs5JDXYTeA5oulcEI//Q3hVrW5E2TQvF 3JQhD2AkRnMukMk3Lxn7imxf/ZSOgWu6F4kJldE4loAk1Mq93o7KqUUfrKpKvnfjz1S5 Q07fHFqYYaacBP+bEzs6O/fr/M0NxCVOG2BOhLV8uEIrEIywcheLe215fd9uwq27qulL e+VA== X-Forwarded-Encrypted: i=1; AJvYcCVA9SxGBX8S08B2zr2LbkDdWMpbBTRlENlKrYZ5r0a/WTzYPwKmxldZBAgn1GRIpYviKtWJghGIdecbGN4=@vger.kernel.org X-Gm-Message-State: AOJu0Yyxa9DxwvsQzKXrqm+Lcp0SEhcK/UEPgIdTGRqESLnC+s+sjEx+ s9SzY8ysgkVWWExFCzTF5jFn210CKmQi4+pAEPC//nz+hblIgQAiXJwlJUntNTQ= X-Gm-Gg: ASbGncsclmhXlz7EZSS4liP1DW32TG29c5T4Xs5iRn2/3f9nAwK+QwhhBmeL2dESqxo ggrh/XP14YIVRfCUEhtq9Nh7uMMGqbolv4QgmK821dUKkAMkyHf4VPRV1c8xfJHahwTF/3Y+VE/ BmEWid6QFnGdKDdhGk5DdELvqhWKP90hBoKMXzrGagmrLi+jeTL6B7QLUOC9IZuBwd7G01x2COa Dbs+SknQljk/1Roi2434rC3Y1ZS7VUFl2/KRcIPMsicmtVVF9+8WvwbiGRJj/XFn6BF/a9z3Ht+ MORAViQAfkJx4v/YK+U= X-Google-Smtp-Source: AGHT+IHlCc/QLtRw9JwUBPb1D2TfS/bysYZ2EBR/Oh5kx6V1EMQBjR3blXWCBV04Zttp3n8xrEcfHg== X-Received: by 2002:a17:902:c40e:b0:21f:1549:a55f with SMTP id d9443c01a7336-21f4e6c0f49mr42137015ad.19.1738908714189; Thu, 06 Feb 2025 22:11:54 -0800 (PST) Received: from localhost ([157.82.205.237]) by smtp.gmail.com with UTF8SMTPSA id d9443c01a7336-21f368d79a7sm22677855ad.253.2025.02.06.22.11.48 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 06 Feb 2025 22:11:53 -0800 (PST) From: Akihiko Odaki Date: Fri, 07 Feb 2025 15:10:57 +0900 Subject: [PATCH net-next v6 7/7] tap: Use tun's vnet-related code Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250207-tun-v6-7-fb49cf8b103e@daynix.com> References: <20250207-tun-v6-0-fb49cf8b103e@daynix.com> In-Reply-To: <20250207-tun-v6-0-fb49cf8b103e@daynix.com> To: Jonathan Corbet , Willem de Bruijn , Jason Wang , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , "Michael S. Tsirkin" , Xuan Zhuo , Shuah Khan , linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, kvm@vger.kernel.org, virtualization@lists.linux-foundation.org, linux-kselftest@vger.kernel.org, Yuri Benditovich , Andrew Melnychenko , Stephen Hemminger , gur.stavi@huawei.com, devel@daynix.com, Akihiko Odaki Cc: Willem de Bruijn X-Mailer: b4 0.14.2 tun and tap implements the same vnet-related features so reuse the code. Signed-off-by: Akihiko Odaki Reviewed-by: Willem de Bruijn --- drivers/net/tap.c | 152 ++++++--------------------------------------------= ---- 1 file changed, 16 insertions(+), 136 deletions(-) diff --git a/drivers/net/tap.c b/drivers/net/tap.c index 8cb002616a6143b54258b65b483fed0c3af2c7a0..1287e241f4454fb8ec4975bbade= d5fbaa88e3cc8 100644 --- a/drivers/net/tap.c +++ b/drivers/net/tap.c @@ -26,74 +26,9 @@ #include #include =20 -#define TAP_IFFEATURES (IFF_VNET_HDR | IFF_MULTI_QUEUE) - -#define TAP_VNET_LE 0x80000000 -#define TAP_VNET_BE 0x40000000 - -#ifdef CONFIG_TUN_VNET_CROSS_LE -static inline bool tap_legacy_is_little_endian(struct tap_queue *q) -{ - return q->flags & TAP_VNET_BE ? false : - virtio_legacy_is_little_endian(); -} - -static long tap_get_vnet_be(struct tap_queue *q, int __user *sp) -{ - int s =3D !!(q->flags & TAP_VNET_BE); - - if (put_user(s, sp)) - return -EFAULT; - - return 0; -} - -static long tap_set_vnet_be(struct tap_queue *q, int __user *sp) -{ - int s; - - if (get_user(s, sp)) - return -EFAULT; - - if (s) - q->flags |=3D TAP_VNET_BE; - else - q->flags &=3D ~TAP_VNET_BE; - - return 0; -} -#else -static inline bool tap_legacy_is_little_endian(struct tap_queue *q) -{ - return virtio_legacy_is_little_endian(); -} - -static long tap_get_vnet_be(struct tap_queue *q, int __user *argp) -{ - return -EINVAL; -} - -static long tap_set_vnet_be(struct tap_queue *q, int __user *argp) -{ - return -EINVAL; -} -#endif /* CONFIG_TUN_VNET_CROSS_LE */ - -static inline bool tap_is_little_endian(struct tap_queue *q) -{ - return q->flags & TAP_VNET_LE || - tap_legacy_is_little_endian(q); -} - -static inline u16 tap16_to_cpu(struct tap_queue *q, __virtio16 val) -{ - return __virtio16_to_cpu(tap_is_little_endian(q), val); -} +#include "tun_vnet.h" =20 -static inline __virtio16 cpu_to_tap16(struct tap_queue *q, u16 val) -{ - return __cpu_to_virtio16(tap_is_little_endian(q), val); -} +#define TAP_IFFEATURES (IFF_VNET_HDR | IFF_MULTI_QUEUE) =20 static struct proto tap_proto =3D { .name =3D "tap", @@ -655,25 +590,13 @@ static ssize_t tap_get_user(struct tap_queue *q, void= *msg_control, if (q->flags & IFF_VNET_HDR) { vnet_hdr_len =3D READ_ONCE(q->vnet_hdr_sz); =20 - err =3D -EINVAL; - if (len < vnet_hdr_len) + hdr_len =3D tun_vnet_hdr_get(vnet_hdr_len, q->flags, from, &vnet_hdr); + if (hdr_len < 0) { + err =3D hdr_len; goto err; - len -=3D vnet_hdr_len; - - err =3D -EFAULT; - if (!copy_from_iter_full(&vnet_hdr, sizeof(vnet_hdr), from)) - goto err; - iov_iter_advance(from, vnet_hdr_len - sizeof(vnet_hdr)); - hdr_len =3D tap16_to_cpu(q, vnet_hdr.hdr_len); - if (vnet_hdr.flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) { - hdr_len =3D max(tap16_to_cpu(q, vnet_hdr.csum_start) + - tap16_to_cpu(q, vnet_hdr.csum_offset) + 2, - hdr_len); - vnet_hdr.hdr_len =3D cpu_to_tap16(q, hdr_len); } - err =3D -EINVAL; - if (tap16_to_cpu(q, vnet_hdr.hdr_len) > len) - goto err; + + len -=3D vnet_hdr_len; } =20 err =3D -EINVAL; @@ -725,8 +648,7 @@ static ssize_t tap_get_user(struct tap_queue *q, void *= msg_control, skb->dev =3D tap->dev; =20 if (vnet_hdr_len) { - err =3D virtio_net_hdr_to_skb(skb, &vnet_hdr, - tap_is_little_endian(q)); + err =3D tun_vnet_hdr_to_skb(q->flags, skb, &vnet_hdr); if (err) { rcu_read_unlock(); drop_reason =3D SKB_DROP_REASON_DEV_HDR; @@ -789,23 +711,17 @@ static ssize_t tap_put_user(struct tap_queue *q, int total; =20 if (q->flags & IFF_VNET_HDR) { - int vlan_hlen =3D skb_vlan_tag_present(skb) ? VLAN_HLEN : 0; struct virtio_net_hdr vnet_hdr; =20 vnet_hdr_len =3D READ_ONCE(q->vnet_hdr_sz); - if (iov_iter_count(iter) < vnet_hdr_len) - return -EINVAL; - - if (virtio_net_hdr_from_skb(skb, &vnet_hdr, - tap_is_little_endian(q), true, - vlan_hlen)) - BUG(); =20 - if (copy_to_iter(&vnet_hdr, sizeof(vnet_hdr), iter) !=3D - sizeof(vnet_hdr)) - return -EFAULT; + ret =3D tun_vnet_hdr_from_skb(q->flags, NULL, skb, &vnet_hdr); + if (ret) + return ret; =20 - iov_iter_advance(iter, vnet_hdr_len - sizeof(vnet_hdr)); + ret =3D tun_vnet_hdr_put(vnet_hdr_len, iter, &vnet_hdr); + if (ret) + return ret; } total =3D vnet_hdr_len; total +=3D skb->len; @@ -1064,42 +980,6 @@ static long tap_ioctl(struct file *file, unsigned int= cmd, q->sk.sk_sndbuf =3D s; return 0; =20 - case TUNGETVNETHDRSZ: - s =3D q->vnet_hdr_sz; - if (put_user(s, sp)) - return -EFAULT; - return 0; - - case TUNSETVNETHDRSZ: - if (get_user(s, sp)) - return -EFAULT; - if (s < (int)sizeof(struct virtio_net_hdr)) - return -EINVAL; - - q->vnet_hdr_sz =3D s; - return 0; - - case TUNGETVNETLE: - s =3D !!(q->flags & TAP_VNET_LE); - if (put_user(s, sp)) - return -EFAULT; - return 0; - - case TUNSETVNETLE: - if (get_user(s, sp)) - return -EFAULT; - if (s) - q->flags |=3D TAP_VNET_LE; - else - q->flags &=3D ~TAP_VNET_LE; - return 0; - - case TUNGETVNETBE: - return tap_get_vnet_be(q, sp); - - case TUNSETVNETBE: - return tap_set_vnet_be(q, sp); - case TUNSETOFFLOAD: /* let the user check for future flags */ if (arg & ~(TUN_F_CSUM | TUN_F_TSO4 | TUN_F_TSO6 | @@ -1143,7 +1023,7 @@ static long tap_ioctl(struct file *file, unsigned int= cmd, return ret; =20 default: - return -EINVAL; + return tun_vnet_ioctl(&q->vnet_hdr_sz, &q->flags, cmd, sp); } } =20 @@ -1190,7 +1070,7 @@ static int tap_get_user_xdp(struct tap_queue *q, stru= ct xdp_buff *xdp) skb->protocol =3D eth_hdr(skb)->h_proto; =20 if (vnet_hdr_len) { - err =3D virtio_net_hdr_to_skb(skb, gso, tap_is_little_endian(q)); + err =3D tun_vnet_hdr_to_skb(q->flags, skb, gso); if (err) goto err_kfree; } --=20 2.48.1