Commit 31c5a71d authored by Paolo Abeni's avatar Paolo Abeni Committed by Jakub Kicinski
Browse files

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[1]:

	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
devices, and the current status quo will require more duplicate code and
a new indirect call in the TX path for them.

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 [1] is incorrect if the NIC additionally implements
NETIF_F_GSO_UDP_L4, mangleid_features transparently handle even such a
case.

Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/5a7cdaeea40b0a29b88e525b6c942d73ed3b8ce7.1769011015.git.pabeni@redhat.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 8811df1d
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -1831,6 +1831,8 @@ enum netdev_reg_state {
 *
 *	@mpls_features:	Mask of features inheritable by MPLS
 *	@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
@@ -2219,6 +2221,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;
+4 −1
Original line number Diff line number Diff line
@@ -3802,7 +3802,7 @@ static netdev_features_t gso_features_check(const struct sk_buff *skb,
				    inner_ip_hdr(skb) : ip_hdr(skb);

		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,
@@ -11402,6 +11402,9 @@ int register_netdevice(struct net_device *dev)
	if (dev->hw_enc_features & NETIF_F_TSO)
		dev->hw_enc_features |= NETIF_F_TSO_MANGLEID;

	/* TSO_MANGLEID belongs in mangleid_features by definition */
	dev->mangleid_features |= NETIF_F_TSO_MANGLEID;

	/* Make NETIF_F_HIGHDMA inheritable to VLAN devices.
	 */
	dev->vlan_features |= NETIF_F_HIGHDMA;