From nobody Sun Dec 14 13:44:16 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 0B9D31CEAD3 for ; Thu, 16 Jan 2025 08:08:39 +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=1737014921; cv=none; b=sJdDD601hus3B+S4QG6qDCt8pSiaetiepAuEgGNSB2nsg+L0cL6VTe3KxXt9PBe1VdnZ1rJqoUKu5r95dco50uxKXbPs/4rKadsl7WbmEF9Ifu8NQWMiQY3vPMQjsgHgBsgEBLZub0gUAR0X7t65bretMW8hfrFtYzdfD21EwcA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737014921; c=relaxed/simple; bh=LD3j4cF3ZMXrF9quJO23QS+8dlMHJLISNsvcy2RQu8g=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To; b=sU80SvXCtKmeYfKJkMqSxaomQmDx3NH6yFrUSV54nFM+MIaLu3GuR1upUfPZZFnWhBF72aIIlcvYMLEFO4VlV9LKlpDogAIoWNMyDRu11XgDRScBiSXW4ZKbF8r2X+0AJuY7PuH0Nq77z6h/6w3KFWyjrWnA8wR1/uRA8y5T1nY= 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=IOwbooti; 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="IOwbooti" Received: by mail-pl1-f177.google.com with SMTP id d9443c01a7336-2163dc5155fso9815895ad.0 for ; Thu, 16 Jan 2025 00:08:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=daynix-com.20230601.gappssmtp.com; s=20230601; t=1737014919; x=1737619719; 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=eZHCcie3Jz8m8hktWKIHhBfL5Qmb7ZIYIU8qeIL3Flw=; b=IOwbootiAoYwW850VVPT8aY1OF8iTAuErzhJvJiWgJ1gOBI9Mpx8HIkEMKXrzh9pAT JoMXrRDa1rBbh9r6ejFMALjb5DCYHm0tiglYbb+R7trdij78vAV5eMxYFpvlNGBqpKhZ GVYhcqWMh//44RcnhxwfP2pOOuw1HEYhkzs+UccOgSg4kAUal+cGPkkstt9YiT8Q+Rfh kr9EbYLw7dIn8/Km7N3Fmz5Fxqy/RR5N15JFVNGVePGeHoTOClkTfdLaSDb3EKegyTbg IOuoWkLujizbUPMhc1hw8lcbQEZieqsj8lDGzUhTXi899A9qkbfz0oGfTu1S4XE48m91 Mhww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1737014919; x=1737619719; 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=eZHCcie3Jz8m8hktWKIHhBfL5Qmb7ZIYIU8qeIL3Flw=; b=iw9MKN7Yh+sN1X13D1zsAPds6mzO40xJrwy7uerILe64LXeQijOKLqb9y9zuamoLXC ZZe8iEts1IwPFa7eeAAYDsaohUA9Fj0c2jsppHIzHAxtzX7CxvuIpRTUyrClzf+OBTj9 Yr2P6Eywev8HTOvvoPzd7/zsSYhWPAbBXoGU4jQ2qT5BZTY8R+rGB6gYvrPzVSX2rq9g wwFDe/dGcExr6m+4wUxrmPRgwUd/9Nalu41KtTnS37BUUCTUJ/tIPGFBY0J+3smCcT6g Y0IyRnFzXgp/VZNjAfH5OaE3weTBn7d13WjrW6cTsKqyQ24YsJqIRRB/s87QKzy2mPX1 11+A== X-Forwarded-Encrypted: i=1; AJvYcCWkf/5u9MX1U7kH8iaDxVzX9Ly1K94pI3jEYFBT3a5rAWeWG/pyFo0u7Iuyy05LhzDbU9xH/2/S1Uw65YU=@vger.kernel.org X-Gm-Message-State: AOJu0YxrXQkUXssdQ880RUOatQ/ItnAH/weW8Zk///w562hghMd9Kwqw NpKqJL3n90p1mqS0TzyWXznTmFh2XZApyhxpuNMSxgBXdnVXZkhMfRUeL2qAOd4= X-Gm-Gg: ASbGnctOSmzznuUlrEzTA+6yuDJ+Sb7c7f/B52+jrr15kHrTAuRJ17iUiWDWTDDBpkT czj25JHuWoTnRRBFoL7pa1+Oyn76hUyy168AlltOoK9FiiolCbrfuAt4hdqR4LfJl+keieWMrVH KQQGppDfhl9Pwdl3JHFyCPTBdJJIt1KH8gbnkhFXwHa2XLTPhrwdgwczBLX2AYSVeV7oR8RSbkl KXMuFtLWidH69inDuqSoSTveQ5Qq2ytxRxDZQEJQDBJvrKcqFA8F/vfMTw= X-Google-Smtp-Source: AGHT+IFh9yQIztGDTXss6u8AScgSJUBFClQpr2gqvX+d26toeWNI7G8UL+nQyJLfVgkmE7FH1vRIjQ== X-Received: by 2002:a17:903:94d:b0:216:2af7:a2a3 with SMTP id d9443c01a7336-21a83fe48f2mr535916575ad.53.1737014919344; Thu, 16 Jan 2025 00:08:39 -0800 (PST) Received: from localhost ([157.82.203.37]) by smtp.gmail.com with UTF8SMTPSA id d9443c01a7336-21a9f256b4csm93035125ad.215.2025.01.16.00.08.34 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 16 Jan 2025 00:08:39 -0800 (PST) From: Akihiko Odaki Date: Thu, 16 Jan 2025 17:08:04 +0900 Subject: [PATCH net v3 1/9] 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: <20250116-tun-v3-1-c6b2871e97f7@daynix.com> References: <20250116-tun-v3-0-c6b2871e97f7@daynix.com> In-Reply-To: <20250116-tun-v3-0-c6b2871e97f7@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-dev-fd6e3 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 | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/drivers/net/tun.c b/drivers/net/tun.c index e816aaba8e5f..452fc5104260 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -298,10 +298,10 @@ 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 : + return !(IS_ENABLED(CONFIG_TUN_VNET_CROSS_LE) && + (tun->flags & TUN_VNET_BE)) && virtio_legacy_is_little_endian(); } =20 @@ -309,6 +309,9 @@ 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 +322,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 +335,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.47.1 From nobody Sun Dec 14 13:44:16 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 21FE91A8F89 for ; Thu, 16 Jan 2025 08:08:47 +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=1737014930; cv=none; b=rltHAteTdQXzdI0TN9aakrQWL5YcOnbg3tsYxIYumpLeToU5IRff/9cHrxM8TlzGGbbQ55tJrTItLWHJBToGe7vuEI2IweF/JN+igMKdz5Bl0IZAHLnHP7rougr9SOxq3DHfWDW+TlEc7fQeaD7g5enNIZyZ/+GLo9OOfQwxdQw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737014930; c=relaxed/simple; bh=/419PxDofAsCUo/JZxu3j3vP33oHhAqgdevqSkikvxw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To; b=UYSSuUYSHiK+lsvhLuzoERlIhJfqkLUsEwdQowIc8dyDUA1dVrEJSbwKJzg9okYhEZXb848Xk04ygSYIiV7IpGFLbS1tgs96+sD+I/khVszCYYr106f4EgDyS4IpQsPwKuiRJqKtObh0JP0uo8AcIIBn2Pw3h4hqggNe5MfaXoc= 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=lw8uTMOp; 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="lw8uTMOp" Received: by mail-pl1-f177.google.com with SMTP id d9443c01a7336-219f8263ae0so9539415ad.0 for ; Thu, 16 Jan 2025 00:08:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=daynix-com.20230601.gappssmtp.com; s=20230601; t=1737014927; x=1737619727; 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=2j5vDk29ORNIvTpV6DoLsO8UQi3lrdzW7BTzShujmAk=; b=lw8uTMOpTkm4B4EoWgnbIJEelz40uuijEG50q9xu6lflQ+4iXefIfdUM2YJ0qf5xUW fgd88W+H7aokI2/bvZAJ0vSTU2Nk2GhjVEqAnabxKohA12Ck9JDUCa0sMwVM7YqUFsWX loSdgtZOyCEhTWrTl7GtqDgMIwSfgpLnmylkB2AoKkVJ2YnZgjvd3VzeibSW4BBSe1F4 U0nmiIdz9BHUYo39c6oqkzVTahCUrR3JCQ6P6pygkUv9RROg0AsMUw9Gbf20FusztbJb 4OSuVecofsfme1NgOZFuZzQpTNlUZF02rbItVEUTBxu2lZcqVsznzkDMOB65Q6wb0NaC hXbA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1737014927; x=1737619727; 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=2j5vDk29ORNIvTpV6DoLsO8UQi3lrdzW7BTzShujmAk=; b=QFf0hHxCly7K7LOuJZw61U/8fDrCMkHoyrOrC0ScB6I7NkyTk0klDZWIUqbog5NTtm Joq2RThvUPUCEFWsKOSTNpH8GeSydbLoFaopjtMMKlagq1ardueTnZvlVyfbkTeUicud NYF2M2Bm2H6jYHcecrWrYydRywYB0TtiH08FBrGkMa8JW3oBeC/1cwgvXnbkwjKciO/o nPSqW0omcemuWAVFF7280Ib2IPlADL4+NeXRKzp4fenMFVgbfMGDStm9LO/O9U2kgNpN Bld+53bVoGUICD0QjeEXu+QcOI0NzQIiK4lR1HhKOsMyBnCUTMqbZY9BLe4QqYPUZZsj Lxow== X-Forwarded-Encrypted: i=1; AJvYcCWacq1U5bhGx2unZ6caeTeKYg+cJV4vhpa/zNyqMdnv3/sYn0+G/zpPJO2/JPveiTza+GV8FDvcdDZtITg=@vger.kernel.org X-Gm-Message-State: AOJu0YwLumG5jhlIfh4GJ8a19OWdVknYdU+Bwzuy18acmSjdCcu9VMHg C0bbu9AWJn+MyJze6j7/gVj+5qMYpFoMMa9qE1DKjCiV/Lc5YShBJK4hu1c9i8o= X-Gm-Gg: ASbGncsDz+UB/zAMFivqS70n1BIBYUIDHYSTiV706rr5TVRzaYW++LItaiDU/SrnCot WNxi2VwFoZeeFu/tF8NPS4R4M9giV6wCDlxMuGBTkWSiAthwzwNovBe/MoiiN+7n9KYr4itnlv5 zqndErdt4PbV4OXYAUQlybMVwzYwDUJizbP61NpGBMndsyu13tIoEeIFVMMWuAJRFgWwuzCKCpT ZdFR8VO0FeOg9QSaQa+cfl1zHJov/dPUYUIoazIy5gnLiA4UExyNBLk5dQ= X-Google-Smtp-Source: AGHT+IFXnY5IpJjGACI7HaxQcoaTwGb7qy2/2clnYLiMHQFPxHM1iUKDDNzZY45rgekWHJMGYf+fSg== X-Received: by 2002:a17:902:d2d2:b0:215:a039:738 with SMTP id d9443c01a7336-21a83f42444mr517969985ad.5.1737014927403; Thu, 16 Jan 2025 00:08:47 -0800 (PST) Received: from localhost ([157.82.203.37]) by smtp.gmail.com with UTF8SMTPSA id d9443c01a7336-21a9f10ddd4sm93691125ad.39.2025.01.16.00.08.42 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 16 Jan 2025 00:08:47 -0800 (PST) From: Akihiko Odaki Date: Thu, 16 Jan 2025 17:08:05 +0900 Subject: [PATCH net v3 2/9] tun: Avoid double-tracking iov_iter length changes 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: <20250116-tun-v3-2-c6b2871e97f7@daynix.com> References: <20250116-tun-v3-0-c6b2871e97f7@daynix.com> In-Reply-To: <20250116-tun-v3-0-c6b2871e97f7@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-dev-fd6e3 tun_get_user() used to track the length of iov_iter with another variable. We can use iov_iter_count() to determine the current length to avoid such chores. Signed-off-by: Akihiko Odaki Reviewed-by: Willem de Bruijn --- drivers/net/tun.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 452fc5104260..bd272b4736fb 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -1742,7 +1742,7 @@ static ssize_t tun_get_user(struct tun_struct *tun, s= truct tun_file *tfile, struct tun_pi pi =3D { 0, cpu_to_be16(ETH_P_IP) }; struct sk_buff *skb; size_t total_len =3D iov_iter_count(from); - size_t len =3D total_len, align =3D tun->align, linear; + size_t len, align =3D tun->align, linear; struct virtio_net_hdr gso =3D { 0 }; int good_linear; int copylen; @@ -1754,9 +1754,8 @@ static ssize_t tun_get_user(struct tun_struct *tun, s= truct tun_file *tfile, enum skb_drop_reason drop_reason =3D SKB_DROP_REASON_NOT_SPECIFIED; =20 if (!(tun->flags & IFF_NO_PI)) { - if (len < sizeof(pi)) + if (iov_iter_count(from) < sizeof(pi)) return -EINVAL; - len -=3D sizeof(pi); =20 if (!copy_from_iter_full(&pi, sizeof(pi), from)) return -EFAULT; @@ -1765,9 +1764,8 @@ static ssize_t tun_get_user(struct tun_struct *tun, s= truct tun_file *tfile, if (tun->flags & IFF_VNET_HDR) { int vnet_hdr_sz =3D READ_ONCE(tun->vnet_hdr_sz); =20 - if (len < vnet_hdr_sz) + if (iov_iter_count(from) < vnet_hdr_sz) return -EINVAL; - len -=3D vnet_hdr_sz; =20 if (!copy_from_iter_full(&gso, sizeof(gso), from)) return -EFAULT; @@ -1776,11 +1774,13 @@ static ssize_t tun_get_user(struct tun_struct *tun,= struct tun_file *tfile, 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); =20 - if (tun16_to_cpu(tun, gso.hdr_len) > len) + if (tun16_to_cpu(tun, gso.hdr_len) > iov_iter_count(from)) return -EINVAL; iov_iter_advance(from, vnet_hdr_sz - sizeof(gso)); } =20 + len =3D iov_iter_count(from); + if ((tun->flags & TUN_TYPE_MASK) =3D=3D IFF_TAP) { align +=3D NET_IP_ALIGN; if (unlikely(len < ETH_HLEN || --=20 2.47.1 From nobody Sun Dec 14 13:44:16 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 E3CB31D959B for ; Thu, 16 Jan 2025 08:08:55 +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=1737014937; cv=none; b=NOSMNoH3OyGlaq8omP58d+44OaPDxeqRPq0bBtCmESpyBmMKaj1ZAnzXnG9Kk+Wo2DqyZT/ehKWwx3U9RM1eHhofZiOpi3E2IX3XHDM+f3Zehs2wY9kn9HJmMPNmlifi5lYRypklv4+zbImo6BTCR6wlJDmga73uqRtQQNrs1zY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737014937; c=relaxed/simple; bh=GaoqUecKAtyQ+qguYmr90B1yeZ/UsTWOKRqkOYcnF54=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To; b=Fbvy5PxiEzZ/PyMrk2sZvgvw42V+5B2BdmghC6PQkpj9Zb55NBcXu+2yvveBVS7JGzaxQe1fuTk3eN1Y8tYV86mI9PUglJL/w/OK12lrTnnC7O9uuLYwPYWK3+qCvEtTM6aT1ku6NIu822IuAhAOZnf/YAgRtTeXM5964kpQPXA= 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=olchhKeF; 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="olchhKeF" Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-21636268e43so13082785ad.2 for ; Thu, 16 Jan 2025 00:08:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=daynix-com.20230601.gappssmtp.com; s=20230601; t=1737014935; x=1737619735; 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=Sr3AZgpAWe/4VnOS/hnlHnXvPWA7Ea0pV5fu0VlMHbQ=; b=olchhKeF0ORSjOEUrsFJ32BHlvGzk8IdNKAnnPwSI9mH4RctjOvlvmhReG+Qvk+4GL p32aODsHZrmIyHNYs0mOl/nkUyochFQyGffR5PRhucz+Zn69wkTEWUf+DvmrIBlu3Fpm oq5vvxOa67jtDN2AYHUO4tgxlkipO5/Gsz4Om7nvFOUyEktuSJVy0S65jopX867KJQXO lAw2JN+bCxQTuVmF38hLwz6hjLcq2FdRi/K8lvW69XAeXbGdQBTu9gZRFHHYqttYyqhu B5MuV3/zZfA7GT9p3PVW19wxDdqG+e9T4uXShI5eSuTH6MOVNioP210u/G9UlcPY6wqx 1iAg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1737014935; x=1737619735; 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=Sr3AZgpAWe/4VnOS/hnlHnXvPWA7Ea0pV5fu0VlMHbQ=; b=vARD/26bqVhwtus255UCUmwHAIqdJ18WunA90tCKoTD2mBk1NZNR6qBcB+f/wZdRtY SroVpSU7BXS5N9VM5fX6miBXSKFvpGckLUd7blAV/Ki3fuqh9D/OB0vWvNmxNOeAMpWH cqNmOcwv0fAxZ4EeQZD/ZksEjkdIYrVemV530poIe6YYoChLdyy35ZJ0hHrZvTLu9LaC jx6eP492I3iTD4cqBT43NtdFezTNFzOYSLgIUVbkHqjCAnApPX39M9XALM/trD4tEgyx p691WqH4hW/rhpKu3f3DLcsWk2kwCZcLa0le5PjeOs+dcvNNowaWEB2Wj+5yIfZKVUCy FOzQ== X-Forwarded-Encrypted: i=1; AJvYcCV8Of9sGzGvHj2KirH/knUJaiW2RuSUbozrwoA6OBykGNO6gCbdiHMgBI/YUE9msmQt4mg3jhZJ0/jQpfA=@vger.kernel.org X-Gm-Message-State: AOJu0YywWEUSVKD6Ibf4jh8vXv8ADefg6UgEkkya9LMZFoVi9GDLhFtr FT22Igjh0vPhRCJhghHLeE34QAJgKN2tPW9Evi+n23GTvgwARoSCKwP6HP4rl3E= X-Gm-Gg: ASbGncvlA3LSvcC8Hl7kznMFQOOlmE6QSW4akesZjaFka+yqo+lurksN7zXi91DWGU9 +3/Y7iLyl8e8KoWLjl1QEf0sGk4yEiyWwq0eG9vtzarWL+1JL1u51+3jvYu3ewUNW44gAyjC/Nb sDbtMYVTkaxTLq534GLTBl3rmJnuZ1e6/o3vG5ZFp9XNJPQNDHbXkgLe0Ag/j/+fgj2QYkF89Ip yBb13Fozg9HaqR0w40lBi2b9EehlbBynFKCwGdWBgVLRiCoJXXFfW1vAOs= X-Google-Smtp-Source: AGHT+IHS/tQI+KZgiPpOBaU0C7Tuw2h4kHEXmyIHIVzfFUu8R974PCCRg9snVdH9CSEC/VT7pq33OQ== X-Received: by 2002:a17:903:1c8:b0:215:30d1:36fa with SMTP id d9443c01a7336-21a83ffbe2dmr449801035ad.39.1737014935205; Thu, 16 Jan 2025 00:08:55 -0800 (PST) Received: from localhost ([157.82.203.37]) by smtp.gmail.com with UTF8SMTPSA id d9443c01a7336-21a9f13e9e7sm92600955ad.101.2025.01.16.00.08.49 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 16 Jan 2025 00:08:54 -0800 (PST) From: Akihiko Odaki Date: Thu, 16 Jan 2025 17:08:06 +0900 Subject: [PATCH net v3 3/9] 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: <20250116-tun-v3-3-c6b2871e97f7@daynix.com> References: <20250116-tun-v3-0-c6b2871e97f7@daynix.com> In-Reply-To: <20250116-tun-v3-0-c6b2871e97f7@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-dev-fd6e3 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 | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/drivers/net/tun.c b/drivers/net/tun.c index bd272b4736fb..ec56ac865848 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -1746,6 +1746,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; @@ -1776,6 +1777,7 @@ static ssize_t tun_get_user(struct tun_struct *tun, s= truct tun_file *tfile, =20 if (tun16_to_cpu(tun, gso.hdr_len) > iov_iter_count(from)) return -EINVAL; + hdr_len =3D tun16_to_cpu(tun, gso.hdr_len); iov_iter_advance(from, vnet_hdr_sz - sizeof(gso)); } =20 @@ -1783,8 +1785,7 @@ static ssize_t tun_get_user(struct tun_struct *tun, s= truct tun_file *tfile, =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 @@ -1797,9 +1798,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) @@ -1820,10 +1819,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.47.1 From nobody Sun Dec 14 13:44:16 2025 Received: from mail-pl1-f175.google.com (mail-pl1-f175.google.com [209.85.214.175]) (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 EEEE61993B2 for ; Thu, 16 Jan 2025 08:09:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737014945; cv=none; b=HLBNZ2zqN4M+hHIs/Z54DIEmY7lUHB5aZbKJuZoUQvW/NYoHyRS3XbTDf4AmXm+X1m82rWZWchWdMy5ylgT6+6p5WoDT9lKaz52mqnkxyJIBHlBIZRjigwtgl7GqJAP3NXfenWKe3ZjcqYG4plVoYK5yXb0T94gAq3oGksDghzQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737014945; c=relaxed/simple; bh=7cwGCecJVUq9NE/wEvVpdMm5GKoB/xKHUIbEj6SpY/A=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To; b=XrYDcsptL0nvQBwAoChSar5Wa7VdW5KlOl1uTJr3z4SDKBthrfq0hQqEXug/PdMK7y/9b1UaiHWVHZ6ObU5I2Bs/J66R15Ksz7d5qpQZZql4N0wJUeGBUqk3rnaC0VJDYdbUq0y2Wg3JNeOndxbGkpF7WGWDFlkQa3QkR+Qs9Hs= 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=AEVz/CwQ; arc=none smtp.client-ip=209.85.214.175 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="AEVz/CwQ" Received: by mail-pl1-f175.google.com with SMTP id d9443c01a7336-216634dd574so6270245ad.2 for ; Thu, 16 Jan 2025 00:09:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=daynix-com.20230601.gappssmtp.com; s=20230601; t=1737014943; x=1737619743; 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=1BI+fjEBdkDu0axEe9mBsEt1Vs/iCkft5MGOxEPQjDo=; b=AEVz/CwQM1izB0pEGH6qn6eMPtpX4NrsMmkSEaGkbZm3RAhyAS98ahYewIfl//YtP7 bnm/PL+6X+Q6K+SvzlC1VaTehZ8lYHMtwrFSX834gmWL+Bs9mjcSGhS0HzgyADX9KOOy MGdJ0vB7fGfqD3tBtripL+P1AdBPgdB8OTyG85ih5WvzsqzBK01jRqkE88iBinmEM1Ux +KfSwZwfHEOZLGCAQ7if352F9skbayOmS/gmRsBPG1GLlvMLpcoIf1mGRXVQxBLONp/x 4h5hWtzHm5d5XszRTqG2xUMJ4Zr7NwTgMr3yd9iDNCZDDbDTng9oeJRYFrGoAJhEiG7I XrgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1737014943; x=1737619743; 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=1BI+fjEBdkDu0axEe9mBsEt1Vs/iCkft5MGOxEPQjDo=; b=gjQFgVq3agwtn6kDkQ4/BEBxjxgiSr8acMac/a4MeWfX3x6493uO0oepYQ5q2q+NSS MMrTynBaYQjhO8i+zyl7hEWpZF81qClhIJtsfV9qWjDB3fcuH/bosg2YRkFL50oa/wjf Sua/JI3+E1AwdcN3mvUye2W+H8A6IXeMnSnoHyVxu/XvmUaHQGfqL870Hyz7y0HPaFLr 8OsCRIylDVM9k8lsgOu0ZBI7JhEo4NNUaOBlF1itZtdzVFxw/b8wqMg06asmwx3yyVz0 JLSkljqgLEYpIqklJpskshJ++KbfVpN2KaxSWHCS9p7s3zl9/HcTGc60RnkYdNLxS8hW DNWQ== X-Forwarded-Encrypted: i=1; AJvYcCV2I0cy7/MOcZuP0OX0hZomyHu8/cQtLgXHglbsocziSogyJdQh6HeZP/DRIaJG0d7zmayf1uLlG6rwlZY=@vger.kernel.org X-Gm-Message-State: AOJu0YwUyLUC/ePsheP2eQGL8qdlNFzaxj3Aviq5sXFVitw8kR6z2WTq HoK8AtaRoZbZak2AjOi4b1hWuZWMlk2ulch0l08Oa+SAFeV+1Ovr6AzRy5SPN5I= X-Gm-Gg: ASbGncuIPhrPOquWjdiTJuvT3frEN3Wf2lHhtHEOa5nFipc0ghH8ehS2zqS9WLnBQnU R/Znt8XRya1NkUNghrf9Barz+ZtRLlwZjZZQUcujTv6Hw36d8KAbHVzCdy6BrSvkILQZ/cxIuk4 xGFIpG2ChrR/77TonfLRNv1HXbraZ0llZmBBQ/Zi9yyJfoyYJdZ9A8Ugv2Bfri8F85iNWDgvTTF sQ+Kv1tFNNQJNx6WCv7nu2tcz5YeRsxENXE0MFuhMjZ2Pi315jNTaQ09CA= X-Google-Smtp-Source: AGHT+IGW8WSgGs2yPkE2cy46mpIsKAMuALM9M++rrp2TlRVQMIKh5cR0l6Hddby7o2+2dD6w//Cn6A== X-Received: by 2002:a05:6a21:1088:b0:1e0:c3bf:7909 with SMTP id adf61e73a8af0-1e88d0ddc8dmr50984607637.41.1737014943273; Thu, 16 Jan 2025 00:09:03 -0800 (PST) Received: from localhost ([157.82.203.37]) by smtp.gmail.com with UTF8SMTPSA id d2e1a72fcca58-72d405943fcsm10371439b3a.78.2025.01.16.00.08.58 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 16 Jan 2025 00:09:02 -0800 (PST) From: Akihiko Odaki Date: Thu, 16 Jan 2025 17:08:07 +0900 Subject: [PATCH net v3 4/9] 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: <20250116-tun-v3-4-c6b2871e97f7@daynix.com> References: <20250116-tun-v3-0-c6b2871e97f7@daynix.com> In-Reply-To: <20250116-tun-v3-0-c6b2871e97f7@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-dev-fd6e3 Decouple vnet-related functions from tun_struct so that we can reuse them for tap in the future. Signed-off-by: Akihiko Odaki --- drivers/net/tun.c | 53 +++++++++++++++++++++++++++------------------------= -- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/drivers/net/tun.c b/drivers/net/tun.c index ec56ac865848..add09dfdada5 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -298,16 +298,16 @@ 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) { return !(IS_ENABLED(CONFIG_TUN_VNET_CROSS_LE) && - (tun->flags & TUN_VNET_BE)) && + (flags & TUN_VNET_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; @@ -318,7 +318,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 @@ -329,27 +329,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) @@ -1764,6 +1763,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 (iov_iter_count(from) < vnet_hdr_sz) return -EINVAL; @@ -1772,12 +1772,12 @@ static ssize_t tun_get_user(struct tun_struct *tun,= struct tun_file *tfile, 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); + tun16_to_cpu(flags, gso.csum_start) + tun16_to_cpu(flags, gso.csum_o= ffset) + 2 > tun16_to_cpu(flags, gso.hdr_len)) + gso.hdr_len =3D cpu_to_tun16(flags, tun16_to_cpu(flags, gso.csum_start)= + tun16_to_cpu(flags, gso.csum_offset) + 2); =20 - if (tun16_to_cpu(tun, gso.hdr_len) > iov_iter_count(from)) + if (tun16_to_cpu(flags, gso.hdr_len) > iov_iter_count(from)) return -EINVAL; - hdr_len =3D tun16_to_cpu(tun, gso.hdr_len); + hdr_len =3D tun16_to_cpu(flags, gso.hdr_len); iov_iter_advance(from, vnet_hdr_sz - sizeof(gso)); } =20 @@ -1854,7 +1854,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; @@ -2108,23 +2108,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; @@ -2493,7 +2494,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; @@ -3322,11 +3323,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.47.1 From nobody Sun Dec 14 13:44:16 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 4687919CD07 for ; Thu, 16 Jan 2025 08:09:12 +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=1737014954; cv=none; b=CYo43upN8at9gcUTBIl2LMYWDmEovv/22D7Zo/UN6D0Hkalxt5UEEXw2cz+jUX7puUbFPPS9WIic8ZnZp/2r5QmdtqbqYpNYWKQ1uEWHPX8LVbOcDk7lAkqarKa1ElwoMSA6FJqpoAuCJau2c4Y+1kv+TJm1KvX+iUHLFP23Mxo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737014954; c=relaxed/simple; bh=dlMaXnHmVF0I2Zg/+PIxqJ41UeI7IEme3DeBp0QrHII=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To; b=uOvy7FwQJBD9KPV9i36YzxZQ9Zcy5JCs764TmrH9FlLAV5t/kNre3gOK92D5Ti5nQBOyVxc5attE/1KEUsZhUzkFj/N7K8SGYKWdwSzs29/HyCYALRRshhuXbLPpEJzRDh1HmxdCULJ3KeNLPWb9xmsJuNaB1C1ii6WfY/e1D+g= 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=YswuUOdB; 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="YswuUOdB" Received: by mail-pl1-f177.google.com with SMTP id d9443c01a7336-21670dce0a7so13196005ad.1 for ; Thu, 16 Jan 2025 00:09:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=daynix-com.20230601.gappssmtp.com; s=20230601; t=1737014952; x=1737619752; 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=NTB21hQ3QbIZ1GVa5XRt1Vyvjby7SpDJyzR3ERjrdhY=; b=YswuUOdBiA6KlOkE2kvdBZGT0+JRCmxcB5ZPtBn8DnfoNA3D0StIve12DlPHrdWqs1 bQXEwAAVyB1JFDX7clMvvb3CoSuIhQqifOH4xC6BP84SAXWjgpy2+doBEfycZQkgIArz WlVVhMNZxcfEzrkb20y3mULOx1td7CYd0d0eZjJx9s6oTf3WorlAgesfArUWCbwI9ey+ wuTTzbVwWs5dmwRVSPHEgV9Bxj+sUHZw8AOr6XMUlVHizi6NltGXDl2J/eCU4npEW1U6 YDtFrROmIEQd2Gu5ZgA0bCBWm/tmY7UgCq6ikBtMNi5mdKJP22oyhKqCfgyBItV+AbMH izSQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1737014952; x=1737619752; 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=NTB21hQ3QbIZ1GVa5XRt1Vyvjby7SpDJyzR3ERjrdhY=; b=omc1XpsQWf2XCsn/Kuubq5HnMhVYEKg/ubBPLxrn0bQ2u543VoTEdvvxnW8FJXS7KW dFys5pKdMj95UPzQb/UD2zVpvdVaDhSkWFV246M4DUOXHU0CS2tWNVwmBNI4/tqR2Tkc 2wm5hF59F7N8FTAJV3Ko05CpUNpaJN+6+pHjqdXe9puEY5pqporoCk/AuUazHYxca4b1 JFJJGe0s3f0Hrcv7vlI+tjcqa+Bt7uYr8hlii2o4J4HTa5GrvEVGIAx9Y6SJREwjEcQN x996IfyxCnGJYo6nxVxPGpulpn0eVaRG+2iRnXHGNJvSmbf0Y3bwOAIsqNafjRifx8QO 4tdg== X-Forwarded-Encrypted: i=1; AJvYcCVL9fmSan2vOqKnS4ccPpyogACV5T4/2rDtS+/c4RrNsfmnEZhEw3Mk1/V5yd8AZU70GLr86ujj2G8bqjw=@vger.kernel.org X-Gm-Message-State: AOJu0YxuXAPYMcXVcD6oVNy4OPPd6e3TYvEiXylFHBQH7RZQUkLCiTZN ZiRpuya0yB8xPqxWfxTP7UmEmWtMaXU0WdbBbY66Zpn/VcK84j1rmn1Oeykg0Ig= X-Gm-Gg: ASbGncvQ4S7D+dERuF8heA1zwQGxCFegnc9NqevgMP/tn2NFm4eFUjXPtbrZ+8u2GOc ugj6HaWBTWHI1ROH7KKLfUiFlPV1naJhqYX/qiN+taqrkHR0/fUKkifS5kJJQ7yN+AjwDUZSwHO LIRAZ862feXaixCUHOzvzjkumJpUEdh16lIEVfVwKrcICy6Y0PD3yT3HeLvAilMwy1OY5uy2Flk j4YLArBPtVnogl72rhicIOY1kx84XwW+GRgBDPsr+55mmvrVq3jskP3aNk= X-Google-Smtp-Source: AGHT+IGyfHvFQkE+nB1o/CJ0GNwG1fqSgXmY086Vq0Qo1fUXVryET5W7oD5W9XOC903obMvquEVrHw== X-Received: by 2002:a05:6a00:418e:b0:727:3b77:4174 with SMTP id d2e1a72fcca58-72d22032685mr46595151b3a.23.1737014951264; Thu, 16 Jan 2025 00:09:11 -0800 (PST) Received: from localhost ([157.82.203.37]) by smtp.gmail.com with UTF8SMTPSA id 41be03b00d2f7-a31d5da4f97sm10774264a12.55.2025.01.16.00.09.05 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 16 Jan 2025 00:09:10 -0800 (PST) From: Akihiko Odaki Date: Thu, 16 Jan 2025 17:08:08 +0900 Subject: [PATCH net v3 5/9] 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: <20250116-tun-v3-5-c6b2871e97f7@daynix.com> References: <20250116-tun-v3-0-c6b2871e97f7@daynix.com> In-Reply-To: <20250116-tun-v3-0-c6b2871e97f7@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-dev-fd6e3 Decouple the vnet handling code so that we can reuse it for tap. Signed-off-by: Akihiko Odaki --- drivers/net/tun.c | 229 +++++++++++++++++++++++++++++++-------------------= ---- 1 file changed, 133 insertions(+), 96 deletions(-) diff --git a/drivers/net/tun.c b/drivers/net/tun.c index add09dfdada5..1f4a066ad2f0 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -351,6 +351,122 @@ 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 *sz, unsigned int *flags, + unsigned int cmd, int __user *sp) +{ + int s; + + switch (cmd) { + case TUNGETVNETHDRSZ: + s =3D *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; + + *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) +{ + if (iov_iter_count(from) < sz) + return -EINVAL; + + if (!copy_from_iter_full(hdr, sizeof(*hdr), from)) + return -EFAULT; + + if ((hdr->flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) && + tun16_to_cpu(flags, hdr->csum_start) + tun16_to_cpu(flags, hdr->csum_= offset) + 2 > tun16_to_cpu(flags, hdr->hdr_len)) + hdr->hdr_len =3D cpu_to_tun16(flags, tun16_to_cpu(flags, hdr->csum_start= ) + tun16_to_cpu(flags, hdr->csum_offset) + 2); + + if (tun16_to_cpu(flags, hdr->hdr_len) > iov_iter_count(from)) + return -EINVAL; + + iov_iter_advance(from, sz - sizeof(*hdr)); + + return tun16_to_cpu(flags, hdr->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; @@ -1763,22 +1879,10 @@ 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 (iov_iter_count(from) < vnet_hdr_sz) - return -EINVAL; - - if (!copy_from_iter_full(&gso, sizeof(gso), from)) - return -EFAULT; =20 - if ((gso.flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) && - tun16_to_cpu(flags, gso.csum_start) + tun16_to_cpu(flags, gso.csum_o= ffset) + 2 > tun16_to_cpu(flags, gso.hdr_len)) - gso.hdr_len =3D cpu_to_tun16(flags, tun16_to_cpu(flags, gso.csum_start)= + tun16_to_cpu(flags, gso.csum_offset) + 2); - - if (tun16_to_cpu(flags, gso.hdr_len) > iov_iter_count(from)) - return -EINVAL; - hdr_len =3D tun16_to_cpu(flags, gso.hdr_len); - iov_iter_advance(from, vnet_hdr_sz - sizeof(gso)); + hdr_len =3D tun_vnet_hdr_get(vnet_hdr_sz, tun->flags, from, &gso); + if (hdr_len < 0) + return hdr_len; } =20 len =3D iov_iter_count(from); @@ -1854,7 +1958,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; @@ -2049,18 +2153,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; @@ -2083,6 +2184,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; @@ -2108,33 +2210,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) { @@ -2494,7 +2577,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; @@ -3078,8 +3161,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 @@ -3286,50 +3367,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; @@ -3385,7 +3422,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.47.1 From nobody Sun Dec 14 13:44:16 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 43E861ADFE3 for ; Thu, 16 Jan 2025 08:09:19 +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=1737014961; cv=none; b=CzktQh36pJqpFt/NgpaDCg1GvejN8ysroPDjED+dPFtqrE8S7jQyfyU58bhMzhvpVkGpofP+i5mxLxNcQZStbd0MtAR4JTc+tC2Byg+Lf3qk2jBX3RxeIPCPEu3/3sqdiQqz6QdWQ2Ua4h8Dzqauk0mwt6quvJf+fzYy85CggtU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737014961; c=relaxed/simple; bh=6i5mOKP9NEm5Jj1SahJJsaXvJcRAMKAZum6TzL+GnIE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To; b=QN5y3Ji28hLKgoYt2ogB7F3qNN6hykzalLSaJ6H6tPqUa7iKjI7bjlGT7eHqwEg6MMp+212a3xglmcEdiM0l8xuLt2dQ6heyheaKFJf8/WUlLBl9oipYy4ctT/ndEm3CmCqJJMd1otOmyLx0Til4kNaE8BQW0WxZ4OouS4ZrJ3M= 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=1yYQSzUe; 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="1yYQSzUe" Received: by mail-pl1-f178.google.com with SMTP id d9443c01a7336-2161eb94cceso6686095ad.2 for ; Thu, 16 Jan 2025 00:09:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=daynix-com.20230601.gappssmtp.com; s=20230601; t=1737014958; x=1737619758; 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=jiInKuLfMqKsNEEbrCxZt89s3ayXkt/ecAhGBDrf+VA=; b=1yYQSzUeUNn68La+ji6fLUUBl1HoylfFNy+JlJ1L1Q/3xhn+yr05jEhyclpziuTPRq YqiYnatZ4KEHfhFoy3SoI9Qm22i9PU0TVcipAgPJsoWjsloF1ZPgLCAhU7icxkFZc7Qf d5FUpXzJjLa3qMeAHBMEpEmebByHFqD86W2LB8Oc7NhJGAQ46mUwGrhqP2ffAry9wTrk G2VOI8/osQhaogCCUyJoRIvsqWfOno0OeW4MmoIjLsXH63tHJICrWe25Qaj9FasihyS4 f2Kzr7atFNm8FfKw65eZ7ow9t1BZPJhyXfFaylTemplXK3rVSq8GvOo8f+ZmimQ+xsec pYHw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1737014958; x=1737619758; 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=jiInKuLfMqKsNEEbrCxZt89s3ayXkt/ecAhGBDrf+VA=; b=Xt8UI+0yXpxy63vn3EIB5iWwJdbf1LQ6DFFXLA6lA8GPHtif2/iaxMm0pifgB7L4d8 3ACYUw41pGw6GKQyxhC/lVjru/J3gIqAm5uSxtDmK1tB3IZCNP91oG37AgWi+3h3v3h1 IMlEiaWJpITeAs/giqa74JfdEpvUJg8bwd395nj0HE+E3nVud67lVGfMJCLwbYWGaj7+ HOnLomslZbNEaxCDhf3N4+UEt+kxlm0hfjesjOqpFPs5JcmM9kyn9A182mIfMr9YfmcP 55OzSJ0XQFAFTM5SX+KH8UIMw0mhxVFhLQw31OR9wRfmqgcU/P4d00ZX5vnXM8PM7VR6 tLjw== X-Forwarded-Encrypted: i=1; AJvYcCVz6zUNXiTHf0QrkEzxuv/LbyXKaA6dypGYGjUq7k7ANRZizdAXb2n+ylZa4VUi7XbF+t/U4I/NNRx1E0A=@vger.kernel.org X-Gm-Message-State: AOJu0YzHpk+GBppdcx+LePgCj9WlHyS17NGpxDCYERD6gouiNAyiwdmP +vLq4np2yWN0pOuKAiYB2qWBdFn5JpVZmpi0l8sGNEHrJSAeyHHJQ4uWDsnSMHk= X-Gm-Gg: ASbGncsrQoVWT7bq+Z3G31fz2YkRyR4oOYy1mc3/yG6tOCLER0G/4TiPKFdI9CrbOe8 qhTQDrpzuRTvCNxmCT1F7uv7qbaMx5FZRfIRkE5DrZkwTb2+VLSD7zgaFa66i1Arr+uGnwvouMx Aq7vnF+uzOPgI/xBnx3QKWOeEJZjEoLTks1rWn6sW2rBWhdQ4Cne5gVUKqFaAOzKh2HpnbWa+de 2JrWRMlH+GZ/sSgcFzruZqiCc7HQmP0iwd0IEKDy1vjq8vV36okIyDdk4s= X-Google-Smtp-Source: AGHT+IGJzSwImNIfquXyLNzCaVVwBlahL6/50pPE614F74j7F/f8Q6sh9sDyyPJxHr17hO0VTanhOA== X-Received: by 2002:a05:6a00:3287:b0:725:456e:76e with SMTP id d2e1a72fcca58-72d21fb1d3fmr44761330b3a.6.1737014958621; Thu, 16 Jan 2025 00:09:18 -0800 (PST) Received: from localhost ([157.82.203.37]) by smtp.gmail.com with UTF8SMTPSA id d2e1a72fcca58-72d405943f1sm10202787b3a.84.2025.01.16.00.09.13 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 16 Jan 2025 00:09:18 -0800 (PST) From: Akihiko Odaki Date: Thu, 16 Jan 2025 17:08:09 +0900 Subject: [PATCH net v3 6/9] 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: <20250116-tun-v3-6-c6b2871e97f7@daynix.com> References: <20250116-tun-v3-0-c6b2871e97f7@daynix.com> In-Reply-To: <20250116-tun-v3-0-c6b2871e97f7@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-dev-fd6e3 The vnet handling code will be reused by tap. Signed-off-by: Akihiko Odaki --- MAINTAINERS | 2 +- drivers/net/Makefile | 3 +- drivers/net/tun.c | 174 +--------------------------------------------= --- drivers/net/tun_vnet.c | 175 +++++++++++++++++++++++++++++++++++++++++++++= ++++ drivers/net/tun_vnet.h | 25 +++++++ 5 files changed, 205 insertions(+), 174 deletions(-) diff --git a/MAINTAINERS b/MAINTAINERS index 910305c11e8a..bc32b7e23c79 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/Makefile b/drivers/net/Makefile index 13743d0e83b5..bb8eb3053772 100644 --- a/drivers/net/Makefile +++ b/drivers/net/Makefile @@ -29,7 +29,8 @@ obj-y +=3D mdio/ obj-y +=3D pcs/ obj-$(CONFIG_RIONET) +=3D rionet.o obj-$(CONFIG_NET_TEAM) +=3D team/ -obj-$(CONFIG_TUN) +=3D tun.o +obj-$(CONFIG_TUN) +=3D tun-drv.o +tun-drv-y :=3D tun.o tun_vnet.o obj-$(CONFIG_TAP) +=3D tap.o obj-$(CONFIG_VETH) +=3D veth.o obj-$(CONFIG_VIRTIO_NET) +=3D virtio_net.o diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 1f4a066ad2f0..21abd3613cac 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,175 +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) -{ - return !(IS_ENABLED(CONFIG_TUN_VNET_CROSS_LE) && - (flags & TUN_VNET_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 *sz, unsigned int *flags, - unsigned int cmd, int __user *sp) -{ - int s; - - switch (cmd) { - case TUNGETVNETHDRSZ: - s =3D *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; - - *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) -{ - if (iov_iter_count(from) < sz) - return -EINVAL; - - if (!copy_from_iter_full(hdr, sizeof(*hdr), from)) - return -EFAULT; - - if ((hdr->flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) && - tun16_to_cpu(flags, hdr->csum_start) + tun16_to_cpu(flags, hdr->csum_= offset) + 2 > tun16_to_cpu(flags, hdr->hdr_len)) - hdr->hdr_len =3D cpu_to_tun16(flags, tun16_to_cpu(flags, hdr->csum_start= ) + tun16_to_cpu(flags, hdr->csum_offset) + 2); - - if (tun16_to_cpu(flags, hdr->hdr_len) > iov_iter_count(from)) - return -EINVAL; - - iov_iter_advance(from, sz - sizeof(*hdr)); - - return tun16_to_cpu(flags, hdr->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.c b/drivers/net/tun_vnet.c new file mode 100644 index 000000000000..5a6cbfb6eed0 --- /dev/null +++ b/drivers/net/tun_vnet.c @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +#include "tun_vnet.h" + +/* High bits in flags field are unused. */ +#define TUN_VNET_LE 0x80000000 +#define TUN_VNET_BE 0x40000000 + +static inline bool tun_legacy_is_little_endian(unsigned int flags) +{ + return !(IS_ENABLED(CONFIG_TUN_VNET_CROSS_LE) && + (flags & TUN_VNET_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); +} + +long tun_vnet_ioctl(int *sz, unsigned int *flags, + unsigned int cmd, int __user *sp) +{ + int s; + + switch (cmd) { + case TUNGETVNETHDRSZ: + s =3D *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; + + *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; + } +} + +int tun_vnet_hdr_get(int sz, unsigned int flags, struct iov_iter *from, + struct virtio_net_hdr *hdr) +{ + if (iov_iter_count(from) < sz) + return -EINVAL; + + if (!copy_from_iter_full(hdr, sizeof(*hdr), from)) + return -EFAULT; + + if ((hdr->flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) && + tun16_to_cpu(flags, hdr->csum_start) + tun16_to_cpu(flags, hdr->csum_= offset) + 2 > tun16_to_cpu(flags, hdr->hdr_len)) + hdr->hdr_len =3D cpu_to_tun16(flags, tun16_to_cpu(flags, hdr->csum_start= ) + tun16_to_cpu(flags, hdr->csum_offset) + 2); + + if (tun16_to_cpu(flags, hdr->hdr_len) > iov_iter_count(from)) + return -EINVAL; + + iov_iter_advance(from, sz - sizeof(*hdr)); + + return tun16_to_cpu(flags, hdr->hdr_len); +} + +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; +} + +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)); +} + +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; +} diff --git a/drivers/net/tun_vnet.h b/drivers/net/tun_vnet.h new file mode 100644 index 000000000000..a8d6e4749333 --- /dev/null +++ b/drivers/net/tun_vnet.h @@ -0,0 +1,25 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +#ifndef TUN_VNET_H +#define TUN_VNET_H + +#include +#include + +long tun_vnet_ioctl(int *sz, unsigned int *flags, + unsigned int cmd, int __user *sp); + +int tun_vnet_hdr_get(int sz, unsigned int flags, struct iov_iter *from, + struct virtio_net_hdr *hdr); + +int tun_vnet_hdr_put(int sz, struct iov_iter *iter, + const struct virtio_net_hdr *hdr); + +int tun_vnet_hdr_to_skb(unsigned int flags, struct sk_buff *skb, + const struct virtio_net_hdr *hdr); + +int tun_vnet_hdr_from_skb(unsigned int flags, + const struct net_device *dev, + const struct sk_buff *skb, + struct virtio_net_hdr *hdr); + +#endif /* TUN_VNET_H */ --=20 2.47.1 From nobody Sun Dec 14 13:44:16 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 75C531DE3BA for ; Thu, 16 Jan 2025 08:09:26 +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=1737014968; cv=none; b=YMzkOdASkCQKFEwAmJ0JM9mDjtGolavchMb7GKdMSJWKLxF1QAJN5rImVl9Synp5lHMDj+pavtXCTnufuFCLwx6E6CZDPFO+m+fz+GTfAGYHcg7FELfs9pFsirF6lLCi2ydhkr0tuJbd2fcApAfT8GRckAV37mK5Y04+LBy28B0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737014968; c=relaxed/simple; bh=jRpYSf9eaW+ho0lzpltGMAxASRyw0CEV/6XfYdKY0IY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To; b=Ckf5IZ6btnslWko/jTAmP9bXdeUZJtnwlTcJL/NNH8Zkkf0E7Hxo2slnFn1iAt5SYWYSCJgnnEnkR+Pmj2Cp7UluxNEiLRfqwURKlt/bWUuyi6ijO1Rnc/RYnk2Awzo5WaEC2rw2ET9ESigXRyl0tNVlxTvdIsOYOIEm69Y/BKk= 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=BHlcto/g; 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="BHlcto/g" Received: by mail-pl1-f182.google.com with SMTP id d9443c01a7336-2166651f752so13308765ad.3 for ; Thu, 16 Jan 2025 00:09:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=daynix-com.20230601.gappssmtp.com; s=20230601; t=1737014966; x=1737619766; 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=x6XeS8X9JmzzO8cEu3bDg1COvcoMcAqw6E54ck6GWVA=; b=BHlcto/gWLAIqBZNfkMqUhA+mPI4NKQhTsoJCZMTiOk9VtUeBLCmqL5yB/v9M9oD7Q TPeIAH0Befg2dZlnDwB+SSafhD48aEzLLzqgBaT8UU/1IyCLhY9GfiUw+u40HbIINmQm pjdb6IIuplEuc97V1WlvFTlizLdCKOsWUvZksbeFsNFOUBCJYbJM6NpXIRWBlG8NOtzz FrL7b0Dd94mTumsoh2xRLkISqvdFvyDejqf9fkXkhYZNXqjClh+b6vX5gyyvBL+VVVI8 /fpoZbkoSHwGO0avrzJgDgA00fHlewUllVjh4poC1LSFQlwAy/O/iofVkBebgwVUyWdG KWuQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1737014966; x=1737619766; 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=x6XeS8X9JmzzO8cEu3bDg1COvcoMcAqw6E54ck6GWVA=; b=QRiqxAcurxnay+Edhk8TaR9Mnrl07QuFugz44Svt7Vl12+eGDj8qRdP9+akTaHX6Db uPVXhv2ThPhvbfX7mW0ZUR2VEAPMiNplnhxqDtusw50yDYpwQa4vQirFgiH3/4r1gyfj putM9Y6YG9zoIOSrIVLzmgfotf3cYi7Yv17kVIE3bLkbuSzN8/11sqC5FduD7cX5gltm fmxZRpfJvKsui2dAuIoOMTrvXvVhQ9YsmHZvbNUtEX7evI5LzKZnpxzOhRE/fkk0yZxV NUlC7dUVjOr3B4YXBf6ezscH4lTDrvCg0qLoEQCGwnrOkAs/liVBsevTLEQnr7Fgonx8 UduQ== X-Forwarded-Encrypted: i=1; AJvYcCU0Qf8n5KBhrdn99V+z+nedHqZi2zZJ7SlW15BIUVghGWQ9+gLzPwJrVUtnhNIEJdl/dibLoyBNomTlKxM=@vger.kernel.org X-Gm-Message-State: AOJu0Yy1t5Gi6thyBXjy+kJgnK+DajNLXEs4B1Z5KnDfNoef2GH6fQ6t taREfsXOg1DKHMV3TSdD6QUGQm0dTRz6bijm85FzIrJBcW7plpu1YtXQVDhNul0= X-Gm-Gg: ASbGncsO7BKq8telMAzwmy/2ta57adw5LLXNEDis27mS2eEjxKU2xZgNibdXsrmkqyX mPC+K91jsauF0uj6dlEtwSqVjEVsSFuLECfAoKQ7Hs8SF7SFAbUKVM7zMgq8VNLymjR6J7dw0CV khj7/z6tLGM/rVymYfEEWtJXcJ/79a+oo6Pk861sQVGmZogRMGRkwVeDiMBriBbELvxm1PlmZZP zuv/Lr2r/hEXNrohm/S0ShpNAWqQz0I0/K2Qb/h+WLYOcDPKX5MX8ZLsX8= X-Google-Smtp-Source: AGHT+IHnr5s5lbwKZ8hVxzCBLTjyfZY+984W/EhLpkGsedZ1ouritoL5gtdrAjRGaaFIzstL0hHTgA== X-Received: by 2002:a05:6a20:3d86:b0:1e0:c5d2:f215 with SMTP id adf61e73a8af0-1e88d18b424mr16255509637.12.1737014965864; Thu, 16 Jan 2025 00:09:25 -0800 (PST) Received: from localhost ([157.82.203.37]) by smtp.gmail.com with UTF8SMTPSA id d2e1a72fcca58-72d406a4dddsm10309766b3a.155.2025.01.16.00.09.20 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 16 Jan 2025 00:09:25 -0800 (PST) From: Akihiko Odaki Date: Thu, 16 Jan 2025 17:08:10 +0900 Subject: [PATCH net v3 7/9] tap: Avoid double-tracking iov_iter length changes 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: <20250116-tun-v3-7-c6b2871e97f7@daynix.com> References: <20250116-tun-v3-0-c6b2871e97f7@daynix.com> In-Reply-To: <20250116-tun-v3-0-c6b2871e97f7@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-dev-fd6e3 tap_get_user() used to track the length of iov_iter with another variable. We can use iov_iter_count() to determine the current length to avoid such chores. Signed-off-by: Akihiko Odaki --- drivers/net/tap.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/drivers/net/tap.c b/drivers/net/tap.c index 5aa41d5f7765..061c2f27dfc8 100644 --- a/drivers/net/tap.c +++ b/drivers/net/tap.c @@ -641,7 +641,7 @@ static ssize_t tap_get_user(struct tap_queue *q, void *= msg_control, struct sk_buff *skb; struct tap_dev *tap; unsigned long total_len =3D iov_iter_count(from); - unsigned long len =3D total_len; + unsigned long len; int err; struct virtio_net_hdr vnet_hdr =3D { 0 }; int vnet_hdr_len =3D 0; @@ -655,9 +655,8 @@ static ssize_t tap_get_user(struct tap_queue *q, void *= msg_control, vnet_hdr_len =3D READ_ONCE(q->vnet_hdr_sz); =20 err =3D -EINVAL; - if (len < vnet_hdr_len) + if (iov_iter_count(from) < vnet_hdr_len) goto err; - len -=3D vnet_hdr_len; =20 err =3D -EFAULT; if (!copy_from_iter_full(&vnet_hdr, sizeof(vnet_hdr), from)) @@ -671,10 +670,12 @@ static ssize_t tap_get_user(struct tap_queue *q, void= *msg_control, tap16_to_cpu(q, vnet_hdr.csum_start) + tap16_to_cpu(q, vnet_hdr.csum_offset) + 2); err =3D -EINVAL; - if (tap16_to_cpu(q, vnet_hdr.hdr_len) > len) + if (tap16_to_cpu(q, vnet_hdr.hdr_len) > iov_iter_count(from)) goto err; } =20 + len =3D iov_iter_count(from); + err =3D -EINVAL; if (unlikely(len < ETH_HLEN)) goto err; --=20 2.47.1 From nobody Sun Dec 14 13:44:16 2025 Received: from mail-pj1-f46.google.com (mail-pj1-f46.google.com [209.85.216.46]) (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 E09111D63F1 for ; Thu, 16 Jan 2025 08:09:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737014975; cv=none; b=HeTs0fmfFM2WSSjVG4NTRmzyRtHawFw55QTXYSh3xLisbPOIIWLaT8XEE2S+TgsdDHELykfY6euNJKLkdnMLQxbIO9TNKhOE88IwWadAc7M4aL5koDk7jhdjUQLAIx8JFq4C3u5//0+TNbaF2HAd6aHS6rG7KZ2xiJBF8E9xDiA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737014975; c=relaxed/simple; bh=hmozYSHMasgRBCBF4xrgoPZ2LwIXeYuHywhslmCDunM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To; b=IC643Z9ZhSlZQU6dVqNo4touhPOd7gB9MM4XbA1wsRbzYGjbCb15pUol8TSEKRFGF9RO+ScE7B7qPUW4eFeGSLq7ttf+bUZwuso8CydrFZpM6vjC4OdzeirCc78BKHTEDswFl5OMWUG8EvfkBzG569guuF286XuJn/yn2+Uhag8= 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=Cek3tFnv; arc=none smtp.client-ip=209.85.216.46 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="Cek3tFnv" Received: by mail-pj1-f46.google.com with SMTP id 98e67ed59e1d1-2ee51f8c47dso967887a91.1 for ; Thu, 16 Jan 2025 00:09:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=daynix-com.20230601.gappssmtp.com; s=20230601; t=1737014973; x=1737619773; 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=XrRxU+soYwScLHZl10nkQ00JQwkyOSxqF0iWMzuJt8Q=; b=Cek3tFnvdD6dLam1Yt3WNkz2Aa7ykL12K02mdVdlspHrhRPv5A8rh8eGPwL+sJOj2C mDvy3OZqaLpgvEqe4Z0tKBMlC69zmyDlFz486/aOGi7ky44oSbSUL14e5qadt5x81biV vTy/OgNunL/1RS7PHeBtmSklmL1LrvFujE/BNeNNZKK7s3NOgCtQdTdVWJT9sPojSMfQ 1HPBx1z7qAbdLQoQv/2yPn3I7xq0/pIc1OvetTfcS7A++hpUZmS78d/VqUPYmpbg2qGu CaClI1Kq/pFP9dkDKNTyJvDq2i29Aoi77u1NFN3QOsvPDj+dVcClwVMs5/Kx+MMIZbqJ Sibw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1737014973; x=1737619773; 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=XrRxU+soYwScLHZl10nkQ00JQwkyOSxqF0iWMzuJt8Q=; b=BUHKPxOesJ07W+VIVzXLker+M+iqe8Fs+tUkNUiDriKgDlgF1Oqh01n76pbEpyjjpl Iggmt/7MktXyaTXOhhztP68BbwNMHg21S1N4MZsE27/0R1ggPZS3EDD+3YMpRPgNibk6 Ihsb7TmCrJubPHt8Xt7ZtR6lyuM20gemaXss534hW2NopHDpBecp0TX9f8Rn0OkFU0ki Z4Aw8UROb6gxF5yDYKe8DSDZw5s+3vXcKDTjduDxbVCO5fIumZMLz+hZgU0xe2dFLfzS v5s2xudrV/TwITzTRSvZOUg01MK0p0uohCJLz7CaZlDuZID4SawvKAPVPZOGglDSE7zK 8Qyg== X-Forwarded-Encrypted: i=1; AJvYcCU5PMnYv4JJKEHF1wVfueFBHuAsjy6qeJnBlCZoLthh+vujVMCW8x14YjOcrxlx5e8B1SkRSoR9obcO1gE=@vger.kernel.org X-Gm-Message-State: AOJu0YxQzseJ+dxFpBgcuocx1rABNRLuFumzYmFjy4qL1qWHIN6YNGOK KHb1WwzYNfIuXkx/FNFw4G1WEE8I0AE2RuzhTd4rS01tVp5LDmMHK/qwJJ6ZoALRMJUYkTm8Iwm WbHU= X-Gm-Gg: ASbGncuorE82zDOKU2YsE8yuKNSqrmYxushBLWhAURN75YZ9U6RH/9Wmoef12VjVCQO xOAPVe6gIoeQagxlFiI4ltNvBtciFIUjHRUQdn+lFS3E9iTgYHRK6zVuFPXZaF47zyZhsTglSl1 P5Y7jQanDBww7OAA7wUt+mziuu5tgGs+iV9gMZmA1otj83LFkbSfx8vUfvHtYBrtpjqJhVaOBiL 7bnM7C0uly4EDHi2qTtN+JQ4lV3ZEFQAhheAhi4YtYZd1MGMJnGzVMQ1A4= X-Google-Smtp-Source: AGHT+IF/aivT7VGN/9qY0NI0lkx2WlvvYYZoSqZ5FMDTYVZ2BGLKcm5XiuPnE5f2W/R9LM3n5U+OJg== X-Received: by 2002:a17:90b:2642:b0:2ea:aa56:499 with SMTP id 98e67ed59e1d1-2f548e9aed3mr42283442a91.1.1737014973234; Thu, 16 Jan 2025 00:09:33 -0800 (PST) Received: from localhost ([157.82.203.37]) by smtp.gmail.com with UTF8SMTPSA id 98e67ed59e1d1-2f72c1ccbd3sm2690558a91.22.2025.01.16.00.09.27 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 16 Jan 2025 00:09:32 -0800 (PST) From: Akihiko Odaki Date: Thu, 16 Jan 2025 17:08:11 +0900 Subject: [PATCH net v3 8/9] 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: <20250116-tun-v3-8-c6b2871e97f7@daynix.com> References: <20250116-tun-v3-0-c6b2871e97f7@daynix.com> In-Reply-To: <20250116-tun-v3-0-c6b2871e97f7@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-dev-fd6e3 hdr_len is repeatedly used so keep it in a local variable. Signed-off-by: Akihiko Odaki --- drivers/net/tap.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/drivers/net/tap.c b/drivers/net/tap.c index 061c2f27dfc8..7ee2e9ee2a89 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; @@ -672,6 +673,7 @@ static ssize_t tap_get_user(struct tap_queue *q, void *= msg_control, err =3D -EINVAL; if (tap16_to_cpu(q, vnet_hdr.hdr_len) > iov_iter_count(from)) goto err; + hdr_len =3D tap16_to_cpu(q, vnet_hdr.hdr_len); } =20 len =3D iov_iter_count(from); @@ -683,11 +685,8 @@ 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 min(hdr_len ? hdr_len : GOODCOPY_LEN, good_linear); + if (copylen < ETH_HLEN) copylen =3D ETH_HLEN; linear =3D copylen; i =3D *from; @@ -698,11 +697,9 @@ 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 min(hdr_len, good_linear); + if (copylen < ETH_HLEN) + copylen =3D ETH_HLEN; } =20 skb =3D tap_alloc_skb(&q->sk, TAP_RESERVE, copylen, --=20 2.47.1 From nobody Sun Dec 14 13:44:16 2025 Received: from mail-pj1-f43.google.com (mail-pj1-f43.google.com [209.85.216.43]) (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 8B23819AD8B for ; Thu, 16 Jan 2025 08:09:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737014984; cv=none; b=XPOapEkzxA+wxsyiJQHPcmeN0b2eQq5B//AvNY3IHbzkovKTYWI9kqHHtfESLwMmazSKqYVaM5/z1rNG/k6WgkHw+tdMcHhuYXPNWwSvomJ1D2ATflEg+qaw5jgnRrf3al00nEFiKULdy3t5YQKbSMGgL9fv4+BXuIbLfb02fu8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737014984; c=relaxed/simple; bh=6Wr52ljDSK+aBTylI+KGQ0tUL4zR+wFOHt7DCtuiU4w=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To; b=tU5ZgIXKNQ5g7FldRbPH8I6jzJ9vfSKnSxozwHc8ua4EkJoczz9+oHsd//83C/nKHZiRWEGqe1KT1m7m0rgt9FOn9dEDNn1NGv/PF8wXlw8mxm6WTtdzsixtQJS6GkvU2y8UIqjMCzTKz0BHaByOYFKXI2kr6mwvo6/2tWKtUyQ= 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=nn8iK0Gl; arc=none smtp.client-ip=209.85.216.43 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="nn8iK0Gl" Received: by mail-pj1-f43.google.com with SMTP id 98e67ed59e1d1-2ee50ffcf14so2874210a91.0 for ; Thu, 16 Jan 2025 00:09:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=daynix-com.20230601.gappssmtp.com; s=20230601; t=1737014981; x=1737619781; 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=+ihEjoAUKBeuLlSZwwwgZEpokxJoyJJceF/H232NOa0=; b=nn8iK0GlMjp78+GXSs3iKk5aV+GAjV0gnh2ckGOtl59DT7RORFZDGqczu3XB7Uf3Dr dj9roNkaBlK8F0NuYIMX9ZT48sdso9DLY6fGGSypfjwUTJwzt1qhJCRiUjxLjhtiSpwj LbNrL1T2LJ1GB8GwLe6+jY3WetKKgyI3mAoBM0YIt+YzP99sH53xQIBimsmZ1rSTGYBW zQ1c1nvI+b1i4MxRNnrT8H8UGWEiSt/utRwbSVMTJDMRiFzHFO1h2iWMe38875C7424s Yt821cpa1x2K4pxW07aHnzxY+VdKf8as2L9vXcfe50rOUmNwgEyvyepDDXtEljmaqeNr R0qw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1737014981; x=1737619781; 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=+ihEjoAUKBeuLlSZwwwgZEpokxJoyJJceF/H232NOa0=; b=aWGsdqwXpefD04qee6UYXg4eGm+tkE7i1w6KqcSfaKUd1gGBd1Hr/j0pgQhbSaI+im dNLXxEa76l94uCNNYBFZn4QQCAu2AYbs4b6k3SO/kcnu2A+7NAsvXqWiptuLFTPUvSWH 9Gy7O6q72ORTEs7wAV1KNgNg175yeu0cpWPCMvrdWUjznasE7KhMM1fcq7wKxGRElMUV JH60VLkUxu1RrnYOYueojZ1t/j+2TIxP34Nj3Htk/k9CpeG1h+UMUlqR27s/XhJMzKC4 Gi6u8MEDgQge+/89YaywZUwViodU815ie/sGDrEsUzXPNdkNBh8/v1WOxj52jjwYCvos YX4A== X-Forwarded-Encrypted: i=1; AJvYcCUwgeZ0/HfdcpFhB0HenALJZafgchD6R9+SZLmwqqJ3bI7oiNYkWsTyms37EaSIKatD6zhQ+GkcYMFy188=@vger.kernel.org X-Gm-Message-State: AOJu0Yyw6G/A1+NP8SoEEJ+2gpB3tJuRbHnz9fW9lsaWD0oYDuRFW85A 3d6AyDJCWe0ignhGbdNYyamJFUK4G/TlYD3bCs2u8Pd68W3vlgZPZsHf4+N8b7A= X-Gm-Gg: ASbGncufkW1SFEJZmpQgeQXpuyPpJs06+FAQ1O6McUhmEd6VEgOeKdMqi8RVNZSqmwv XZVqEk+YI5/Sw95KzP7CpVhMK4P19rVrYD45H/N3MYCHjLgAz0EUns5hom8AhacfFYPkBtxzOuX pBhcOyGXscK5Ud2QHUfhTRz382A1OIanlvyTcjSbIfncqjognT+cWH72VsqbhqXgtR3dOZ5KWD8 XbJLGO1NMF6bd9uXSvSnKyOkZWvFwVVhkvBMZ312z3ZJJ4Smfcps2XOMm4= X-Google-Smtp-Source: AGHT+IGBd3wFyaxz28Bg190hwNC79Eeep+dLLbG4FFSW/Blv0bNRKR2iKwdIv4qJU0FrPxu3LDQuhQ== X-Received: by 2002:a17:90a:fc4f:b0:2ea:8aac:6ac1 with SMTP id 98e67ed59e1d1-2f728e1d11amr9622335a91.15.1737014980551; Thu, 16 Jan 2025 00:09:40 -0800 (PST) Received: from localhost ([157.82.203.37]) by smtp.gmail.com with UTF8SMTPSA id 98e67ed59e1d1-2f72c1e383esm2693388a91.30.2025.01.16.00.09.35 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 16 Jan 2025 00:09:40 -0800 (PST) From: Akihiko Odaki Date: Thu, 16 Jan 2025 17:08:12 +0900 Subject: [PATCH net v3 9/9] 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: <20250116-tun-v3-9-c6b2871e97f7@daynix.com> References: <20250116-tun-v3-0-c6b2871e97f7@daynix.com> In-Reply-To: <20250116-tun-v3-0-c6b2871e97f7@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-dev-fd6e3 tun and tap implements the same vnet-related features so reuse the code. Signed-off-by: Akihiko Odaki --- drivers/net/Kconfig | 1 + drivers/net/Makefile | 6 +- drivers/net/tap.c | 152 +++++----------------------------------------= ---- drivers/net/tun_vnet.c | 5 ++ 4 files changed, 24 insertions(+), 140 deletions(-) diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index 1fd5acdc73c6..c420418473fc 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig @@ -395,6 +395,7 @@ config TUN tristate "Universal TUN/TAP device driver support" depends on INET select CRC32 + select TAP help TUN/TAP provides packet reception and transmission for user space programs. It can be viewed as a simple Point-to-Point or Ethernet diff --git a/drivers/net/Makefile b/drivers/net/Makefile index bb8eb3053772..2275309a97ee 100644 --- a/drivers/net/Makefile +++ b/drivers/net/Makefile @@ -29,9 +29,9 @@ obj-y +=3D mdio/ obj-y +=3D pcs/ obj-$(CONFIG_RIONET) +=3D rionet.o obj-$(CONFIG_NET_TEAM) +=3D team/ -obj-$(CONFIG_TUN) +=3D tun-drv.o -tun-drv-y :=3D tun.o tun_vnet.o -obj-$(CONFIG_TAP) +=3D tap.o +obj-$(CONFIG_TUN) +=3D tun.o +obj-$(CONFIG_TAP) +=3D tap-drv.o +tap-drv-y :=3D tap.o tun_vnet.o obj-$(CONFIG_VETH) +=3D veth.o obj-$(CONFIG_VIRTIO_NET) +=3D virtio_net.o obj-$(CONFIG_VXLAN) +=3D vxlan/ diff --git a/drivers/net/tap.c b/drivers/net/tap.c index 7ee2e9ee2a89..4f3cc3b2e3c6 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,11 @@ 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 (iov_iter_count(from) < vnet_hdr_len) - goto err; - - 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)); - 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); - err =3D -EINVAL; - if (tap16_to_cpu(q, vnet_hdr.hdr_len) > iov_iter_count(from)) + 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; - hdr_len =3D tap16_to_cpu(q, vnet_hdr.hdr_len); + } } =20 len =3D iov_iter_count(from); @@ -731,8 +652,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; @@ -795,23 +715,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; =20 - if (virtio_net_hdr_from_skb(skb, &vnet_hdr, - tap_is_little_endian(q), true, - vlan_hlen)) - BUG(); - - 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; @@ -1070,42 +984,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 | @@ -1149,7 +1027,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 @@ -1196,7 +1074,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; } diff --git a/drivers/net/tun_vnet.c b/drivers/net/tun_vnet.c index 5a6cbfb6eed0..960a5fa5a332 100644 --- a/drivers/net/tun_vnet.c +++ b/drivers/net/tun_vnet.c @@ -104,6 +104,7 @@ long tun_vnet_ioctl(int *sz, unsigned int *flags, return -EINVAL; } } +EXPORT_SYMBOL_GPL(tun_vnet_ioctl); =20 int tun_vnet_hdr_get(int sz, unsigned int flags, struct iov_iter *from, struct virtio_net_hdr *hdr) @@ -125,6 +126,7 @@ int tun_vnet_hdr_get(int sz, unsigned int flags, struct= iov_iter *from, =20 return tun16_to_cpu(flags, hdr->hdr_len); } +EXPORT_SYMBOL_GPL(tun_vnet_hdr_get); =20 int tun_vnet_hdr_put(int sz, struct iov_iter *iter, const struct virtio_net_hdr *hdr) @@ -139,12 +141,14 @@ int tun_vnet_hdr_put(int sz, struct iov_iter *iter, =20 return 0; } +EXPORT_SYMBOL_GPL(tun_vnet_hdr_put); =20 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)); } +EXPORT_SYMBOL_GPL(tun_vnet_hdr_to_skb); =20 int tun_vnet_hdr_from_skb(unsigned int flags, const struct net_device *dev, @@ -173,3 +177,4 @@ int tun_vnet_hdr_from_skb(unsigned int flags, =20 return 0; } +EXPORT_SYMBOL_GPL(tun_vnet_hdr_from_skb); --=20 2.47.1