idpf: fix offloads support for encapsulated packets
[ Upstream commit 713dd6c2deca88cba0596b1e2576f7b7a8e5c59e ]
Split offloads into csum, tso and other offloads so that tunneled
packets do not by default have all the offloads enabled.
Stateless offloads for encapsulated packets are not yet supported in
firmware/software but in the driver we were setting the features same as
non encapsulated features.
Fixed naming to clarify CSUM bits are being checked for Tx.
Inherit netdev features to VLAN interfaces as well.
Fixes: 0fe45467a1 ("idpf: add create vport and netdev configuration")
Reviewed-by: Sridhar Samudrala <sridhar.samudrala@intel.com>
Signed-off-by: Madhu Chittim <madhu.chittim@intel.com>
Tested-by: Zachary Goldstein <zachmgoldstein@google.com>
Tested-by: Samuel Salin <Samuel.salin@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
Reviewed-by: Willem de Bruijn <willemb@google.com>
Link: https://patch.msgid.link/20250425222636.3188441-4-anthony.l.nguyen@intel.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
073791e9cf
commit
d14f88bd0f
@@ -629,13 +629,13 @@ bool idpf_is_capability_ena(struct idpf_adapter *adapter, bool all,
|
||||
VIRTCHNL2_CAP_RX_HSPLIT_AT_L4V4 |\
|
||||
VIRTCHNL2_CAP_RX_HSPLIT_AT_L4V6)
|
||||
|
||||
#define IDPF_CAP_RX_CSUM_L4V4 (\
|
||||
VIRTCHNL2_CAP_RX_CSUM_L4_IPV4_TCP |\
|
||||
VIRTCHNL2_CAP_RX_CSUM_L4_IPV4_UDP)
|
||||
#define IDPF_CAP_TX_CSUM_L4V4 (\
|
||||
VIRTCHNL2_CAP_TX_CSUM_L4_IPV4_TCP |\
|
||||
VIRTCHNL2_CAP_TX_CSUM_L4_IPV4_UDP)
|
||||
|
||||
#define IDPF_CAP_RX_CSUM_L4V6 (\
|
||||
VIRTCHNL2_CAP_RX_CSUM_L4_IPV6_TCP |\
|
||||
VIRTCHNL2_CAP_RX_CSUM_L4_IPV6_UDP)
|
||||
#define IDPF_CAP_TX_CSUM_L4V6 (\
|
||||
VIRTCHNL2_CAP_TX_CSUM_L4_IPV6_TCP |\
|
||||
VIRTCHNL2_CAP_TX_CSUM_L4_IPV6_UDP)
|
||||
|
||||
#define IDPF_CAP_RX_CSUM (\
|
||||
VIRTCHNL2_CAP_RX_CSUM_L3_IPV4 |\
|
||||
@@ -644,11 +644,9 @@ bool idpf_is_capability_ena(struct idpf_adapter *adapter, bool all,
|
||||
VIRTCHNL2_CAP_RX_CSUM_L4_IPV6_TCP |\
|
||||
VIRTCHNL2_CAP_RX_CSUM_L4_IPV6_UDP)
|
||||
|
||||
#define IDPF_CAP_SCTP_CSUM (\
|
||||
#define IDPF_CAP_TX_SCTP_CSUM (\
|
||||
VIRTCHNL2_CAP_TX_CSUM_L4_IPV4_SCTP |\
|
||||
VIRTCHNL2_CAP_TX_CSUM_L4_IPV6_SCTP |\
|
||||
VIRTCHNL2_CAP_RX_CSUM_L4_IPV4_SCTP |\
|
||||
VIRTCHNL2_CAP_RX_CSUM_L4_IPV6_SCTP)
|
||||
VIRTCHNL2_CAP_TX_CSUM_L4_IPV6_SCTP)
|
||||
|
||||
#define IDPF_CAP_TUNNEL_TX_CSUM (\
|
||||
VIRTCHNL2_CAP_TX_CSUM_L3_SINGLE_TUNNEL |\
|
||||
|
||||
@@ -703,8 +703,10 @@ static int idpf_cfg_netdev(struct idpf_vport *vport)
|
||||
{
|
||||
struct idpf_adapter *adapter = vport->adapter;
|
||||
struct idpf_vport_config *vport_config;
|
||||
netdev_features_t other_offloads = 0;
|
||||
netdev_features_t csum_offloads = 0;
|
||||
netdev_features_t tso_offloads = 0;
|
||||
netdev_features_t dflt_features;
|
||||
netdev_features_t offloads = 0;
|
||||
struct idpf_netdev_priv *np;
|
||||
struct net_device *netdev;
|
||||
u16 idx = vport->idx;
|
||||
@@ -766,53 +768,32 @@ static int idpf_cfg_netdev(struct idpf_vport *vport)
|
||||
|
||||
if (idpf_is_cap_ena_all(adapter, IDPF_RSS_CAPS, IDPF_CAP_RSS))
|
||||
dflt_features |= NETIF_F_RXHASH;
|
||||
if (idpf_is_cap_ena_all(adapter, IDPF_CSUM_CAPS, IDPF_CAP_RX_CSUM_L4V4))
|
||||
dflt_features |= NETIF_F_IP_CSUM;
|
||||
if (idpf_is_cap_ena_all(adapter, IDPF_CSUM_CAPS, IDPF_CAP_RX_CSUM_L4V6))
|
||||
dflt_features |= NETIF_F_IPV6_CSUM;
|
||||
if (idpf_is_cap_ena_all(adapter, IDPF_CSUM_CAPS, IDPF_CAP_TX_CSUM_L4V4))
|
||||
csum_offloads |= NETIF_F_IP_CSUM;
|
||||
if (idpf_is_cap_ena_all(adapter, IDPF_CSUM_CAPS, IDPF_CAP_TX_CSUM_L4V6))
|
||||
csum_offloads |= NETIF_F_IPV6_CSUM;
|
||||
if (idpf_is_cap_ena(adapter, IDPF_CSUM_CAPS, IDPF_CAP_RX_CSUM))
|
||||
dflt_features |= NETIF_F_RXCSUM;
|
||||
if (idpf_is_cap_ena_all(adapter, IDPF_CSUM_CAPS, IDPF_CAP_SCTP_CSUM))
|
||||
dflt_features |= NETIF_F_SCTP_CRC;
|
||||
csum_offloads |= NETIF_F_RXCSUM;
|
||||
if (idpf_is_cap_ena_all(adapter, IDPF_CSUM_CAPS, IDPF_CAP_TX_SCTP_CSUM))
|
||||
csum_offloads |= NETIF_F_SCTP_CRC;
|
||||
|
||||
if (idpf_is_cap_ena(adapter, IDPF_SEG_CAPS, VIRTCHNL2_CAP_SEG_IPV4_TCP))
|
||||
dflt_features |= NETIF_F_TSO;
|
||||
tso_offloads |= NETIF_F_TSO;
|
||||
if (idpf_is_cap_ena(adapter, IDPF_SEG_CAPS, VIRTCHNL2_CAP_SEG_IPV6_TCP))
|
||||
dflt_features |= NETIF_F_TSO6;
|
||||
tso_offloads |= NETIF_F_TSO6;
|
||||
if (idpf_is_cap_ena_all(adapter, IDPF_SEG_CAPS,
|
||||
VIRTCHNL2_CAP_SEG_IPV4_UDP |
|
||||
VIRTCHNL2_CAP_SEG_IPV6_UDP))
|
||||
dflt_features |= NETIF_F_GSO_UDP_L4;
|
||||
tso_offloads |= NETIF_F_GSO_UDP_L4;
|
||||
if (idpf_is_cap_ena_all(adapter, IDPF_RSC_CAPS, IDPF_CAP_RSC))
|
||||
offloads |= NETIF_F_GRO_HW;
|
||||
/* advertise to stack only if offloads for encapsulated packets is
|
||||
* supported
|
||||
*/
|
||||
if (idpf_is_cap_ena(vport->adapter, IDPF_SEG_CAPS,
|
||||
VIRTCHNL2_CAP_SEG_TX_SINGLE_TUNNEL)) {
|
||||
offloads |= NETIF_F_GSO_UDP_TUNNEL |
|
||||
NETIF_F_GSO_GRE |
|
||||
NETIF_F_GSO_GRE_CSUM |
|
||||
NETIF_F_GSO_PARTIAL |
|
||||
NETIF_F_GSO_UDP_TUNNEL_CSUM |
|
||||
NETIF_F_GSO_IPXIP4 |
|
||||
NETIF_F_GSO_IPXIP6 |
|
||||
0;
|
||||
|
||||
if (!idpf_is_cap_ena_all(vport->adapter, IDPF_CSUM_CAPS,
|
||||
IDPF_CAP_TUNNEL_TX_CSUM))
|
||||
netdev->gso_partial_features |=
|
||||
NETIF_F_GSO_UDP_TUNNEL_CSUM;
|
||||
|
||||
netdev->gso_partial_features |= NETIF_F_GSO_GRE_CSUM;
|
||||
offloads |= NETIF_F_TSO_MANGLEID;
|
||||
}
|
||||
other_offloads |= NETIF_F_GRO_HW;
|
||||
if (idpf_is_cap_ena(adapter, IDPF_OTHER_CAPS, VIRTCHNL2_CAP_LOOPBACK))
|
||||
offloads |= NETIF_F_LOOPBACK;
|
||||
other_offloads |= NETIF_F_LOOPBACK;
|
||||
|
||||
netdev->features |= dflt_features;
|
||||
netdev->hw_features |= dflt_features | offloads;
|
||||
netdev->hw_enc_features |= dflt_features | offloads;
|
||||
netdev->features |= dflt_features | csum_offloads | tso_offloads;
|
||||
netdev->hw_features |= netdev->features | other_offloads;
|
||||
netdev->vlan_features |= netdev->features | other_offloads;
|
||||
netdev->hw_enc_features |= dflt_features | other_offloads;
|
||||
idpf_set_ethtool_ops(netdev);
|
||||
SET_NETDEV_DEV(netdev, &adapter->pdev->dev);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user