Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mlx4/en_netdev: allow offloading VXLAN over VLAN

ConnectX-3 Pro can offload transmission of VLAN packets with VXLAN inside:
enable tunnel offloads in dev->vlan_features, like it's done with other
NIC drivers (e.g. be2net and ixgbe).

It's no more necessary to change dev->hw_enc_features when VXLAN are added
or removed, since .ndo_features_check() already checks for VXLAN packet
where the UDP destination port matches the configured value. Just set
dev->hw_enc_features when the NIC is initialized, so that overlying VLAN
can correctly inherit the tunnel offload capabilities.

Changes since v1:
- avoid flipping hw_enc_features, instead of calling netdev notifiers,
thanks to Saeed Mahameed
- squash two patches into a single one

CC: Paolo Abeni <pabeni@redhat.com>
CC: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Signed-off-by: Davide Caratti <dcaratti@redhat.com>
Reviewed-by: Saeed Mahameed <saeedm@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Davide Caratti and committed by
David S. Miller
91c6bfb8 85d2c5cd

+17 -26
+17 -26
drivers/net/ethernet/mellanox/mlx4/en_netdev.c
··· 2645 2645 en_err(priv, "failed setting L2 tunnel configuration ret %d\n", ret); 2646 2646 return; 2647 2647 } 2648 - 2649 - /* set offloads */ 2650 - priv->dev->hw_enc_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | 2651 - NETIF_F_RXCSUM | 2652 - NETIF_F_TSO | NETIF_F_TSO6 | 2653 - NETIF_F_GSO_UDP_TUNNEL | 2654 - NETIF_F_GSO_UDP_TUNNEL_CSUM | 2655 - NETIF_F_GSO_PARTIAL; 2656 2648 } 2657 2649 2658 2650 static void mlx4_en_del_vxlan_offloads(struct work_struct *work) ··· 2652 2660 int ret; 2653 2661 struct mlx4_en_priv *priv = container_of(work, struct mlx4_en_priv, 2654 2662 vxlan_del_task); 2655 - /* unset offloads */ 2656 - priv->dev->hw_enc_features &= ~(NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | 2657 - NETIF_F_RXCSUM | 2658 - NETIF_F_TSO | NETIF_F_TSO6 | 2659 - NETIF_F_GSO_UDP_TUNNEL | 2660 - NETIF_F_GSO_UDP_TUNNEL_CSUM | 2661 - NETIF_F_GSO_PARTIAL); 2662 - 2663 2663 ret = mlx4_SET_PORT_VXLAN(priv->mdev->dev, priv->port, 2664 2664 VXLAN_STEER_BY_OUTER_MAC, 0); 2665 2665 if (ret) ··· 3399 3415 if (mdev->LSO_support) 3400 3416 dev->hw_features |= NETIF_F_TSO | NETIF_F_TSO6; 3401 3417 3418 + if (mdev->dev->caps.tunnel_offload_mode == 3419 + MLX4_TUNNEL_OFFLOAD_MODE_VXLAN) { 3420 + dev->hw_features |= NETIF_F_GSO_UDP_TUNNEL | 3421 + NETIF_F_GSO_UDP_TUNNEL_CSUM | 3422 + NETIF_F_GSO_PARTIAL; 3423 + dev->features |= NETIF_F_GSO_UDP_TUNNEL | 3424 + NETIF_F_GSO_UDP_TUNNEL_CSUM | 3425 + NETIF_F_GSO_PARTIAL; 3426 + dev->gso_partial_features = NETIF_F_GSO_UDP_TUNNEL_CSUM; 3427 + dev->hw_enc_features = NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | 3428 + NETIF_F_RXCSUM | 3429 + NETIF_F_TSO | NETIF_F_TSO6 | 3430 + NETIF_F_GSO_UDP_TUNNEL | 3431 + NETIF_F_GSO_UDP_TUNNEL_CSUM | 3432 + NETIF_F_GSO_PARTIAL; 3433 + } 3434 + 3402 3435 dev->vlan_features = dev->hw_features; 3403 3436 3404 3437 dev->hw_features |= NETIF_F_RXCSUM | NETIF_F_RXHASH; ··· 3482 3481 en_warn(priv, 3483 3482 "No RSS hash capabilities exposed, using Toeplitz\n"); 3484 3483 priv->rss_hash_fn = ETH_RSS_HASH_TOP; 3485 - } 3486 - 3487 - if (mdev->dev->caps.tunnel_offload_mode == MLX4_TUNNEL_OFFLOAD_MODE_VXLAN) { 3488 - dev->hw_features |= NETIF_F_GSO_UDP_TUNNEL | 3489 - NETIF_F_GSO_UDP_TUNNEL_CSUM | 3490 - NETIF_F_GSO_PARTIAL; 3491 - dev->features |= NETIF_F_GSO_UDP_TUNNEL | 3492 - NETIF_F_GSO_UDP_TUNNEL_CSUM | 3493 - NETIF_F_GSO_PARTIAL; 3494 - dev->gso_partial_features = NETIF_F_GSO_UDP_TUNNEL_CSUM; 3495 3484 } 3496 3485 3497 3486 /* MTU range: 68 - hw-specific max */