mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 03:44:45 +01:00
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: Paolo Abeni <pabeni@redhat.com> Reviewed-by: Eric Dumazet <edumazet@google.com> Link: https://patch.msgid.link/5a7cdaeea40b0a29b88e525b6c942d73ed3b8ce7.1769011015.git.pabeni@redhat.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
8811df1dd4
commit
31c5a71d98
2 changed files with 7 additions and 1 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue