[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <10db2e40fc6193c43793669f450b40166a48c5d1.1764056123.git.pabeni@redhat.com>
Date: Tue, 25 Nov 2025 17:11:06 +0100
From: Paolo Abeni <pabeni@...hat.com>
To: netdev@...r.kernel.org
Cc: "David S. Miller" <davem@...emloft.net>,
Eric Dumazet <edumazet@...gle.com>,
Jakub Kicinski <kuba@...nel.org>,
Simon Horman <horms@...nel.org>,
Donald Hunter <donald.hunter@...il.com>,
Andrew Lunn <andrew+netdev@...n.ch>,
Shuah Khan <shuah@...nel.org>,
Willem de Bruijn <willemdebruijn.kernel@...il.com>
Subject: [PATCH net-next 01/10] net: introduce mangleid_features
Some/most devices implementing gso_partial need to disable the GSO partial
features when the IP ID can't be mangled; to that extend each of them
implements something alike the following:
if (skb->encapsulation && !(features & NETIF_F_TSO_MANGLEID))
features &= ~NETIF_F_TSO;
in the ndo_features_check() op, which leads to a bit of duplicate code.
Later patch in the series will implement GSO partial support for virtual
device, and the current status quo will require more duplicate code and
a new indirect call in the TX path for such devices.
Introduce the mangleid_features mask, allowing the core to disable NIC
features based on/requiring MANGLEID, without any further intervention
from the driver.
The same functionality could be alternatively implemented adding a single
boolean flag to the struct net_device, but would require an additional
checks in ndo_features_check().
Also note that the above mentioned action is incorrect if the NIC
additionally implements NETIF_F_GSO_UDP_L4, mangleid_features
transparently handle even such a case.
Signed-off-by: Paolo Abeni <pabeni@...hat.com>
---
include/linux/netdevice.h | 5 ++++-
net/core/dev.c | 4 +++-
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index e808071dbb7d..92ff602d8f30 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -1817,7 +1817,9 @@ enum netdev_reg_state {
* and drivers will need to set them appropriately.
*
* @mpls_features: Mask of features inheritable by MPLS
- * @gso_partial_features: value(s) from NETIF_F_GSO\*
+ * @gso_partial_features: value(s) from NETIF_F_GSO
+ * @mangleid_features: Mask of features requiring MANGLEID, will be
+ * disabled together with the latter.
*
* @ifindex: interface index
* @group: The group the device belongs to
@@ -2206,6 +2208,7 @@ struct net_device {
netdev_features_t vlan_features;
netdev_features_t hw_enc_features;
netdev_features_t mpls_features;
+ netdev_features_t mangleid_features;
unsigned int min_mtu;
unsigned int max_mtu;
diff --git a/net/core/dev.c b/net/core/dev.c
index 69515edd17bc..9d3bbc0529d5 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -3789,8 +3789,10 @@ static netdev_features_t gso_features_check(const struct sk_buff *skb,
struct iphdr *iph = skb->encapsulation ?
inner_ip_hdr(skb) : ip_hdr(skb);
- if (!(iph->frag_off & htons(IP_DF)))
+ if (!(iph->frag_off & htons(IP_DF))) {
features &= ~NETIF_F_TSO_MANGLEID;
+ features &= ~dev->mangleid_features;
+ }
}
/* NETIF_F_IPV6_CSUM does not support IPv6 extension headers,
--
2.52.0
Powered by blists - more mailing lists