mlx4/en_netdev: allow offloading VXLAN over VLAN
authorDavide Caratti <dcaratti@redhat.com>
Fri, 26 Jul 2019 18:18:12 +0000 (20:18 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sat, 27 Jul 2019 21:22:32 +0000 (14:22 -0700)
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>
drivers/net/ethernet/mellanox/mlx4/en_netdev.c

index c1438ae52a11922a79b281937f5d6bb5a7b4ca3b..40ec5acf79c03b97ec77a8c20249ff5c4dda2149 100644 (file)
@@ -2645,14 +2645,6 @@ out:
                en_err(priv, "failed setting L2 tunnel configuration ret %d\n", ret);
                return;
        }
-
-       /* set offloads */
-       priv->dev->hw_enc_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
-                                     NETIF_F_RXCSUM |
-                                     NETIF_F_TSO | NETIF_F_TSO6 |
-                                     NETIF_F_GSO_UDP_TUNNEL |
-                                     NETIF_F_GSO_UDP_TUNNEL_CSUM |
-                                     NETIF_F_GSO_PARTIAL;
 }
 
 static void mlx4_en_del_vxlan_offloads(struct work_struct *work)
@@ -2660,14 +2652,6 @@ static void mlx4_en_del_vxlan_offloads(struct work_struct *work)
        int ret;
        struct mlx4_en_priv *priv = container_of(work, struct mlx4_en_priv,
                                                 vxlan_del_task);
-       /* unset offloads */
-       priv->dev->hw_enc_features &= ~(NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
-                                       NETIF_F_RXCSUM |
-                                       NETIF_F_TSO | NETIF_F_TSO6 |
-                                       NETIF_F_GSO_UDP_TUNNEL |
-                                       NETIF_F_GSO_UDP_TUNNEL_CSUM |
-                                       NETIF_F_GSO_PARTIAL);
-
        ret = mlx4_SET_PORT_VXLAN(priv->mdev->dev, priv->port,
                                  VXLAN_STEER_BY_OUTER_MAC, 0);
        if (ret)
@@ -3415,6 +3399,23 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
        if (mdev->LSO_support)
                dev->hw_features |= NETIF_F_TSO | NETIF_F_TSO6;
 
+       if (mdev->dev->caps.tunnel_offload_mode ==
+           MLX4_TUNNEL_OFFLOAD_MODE_VXLAN) {
+               dev->hw_features |= NETIF_F_GSO_UDP_TUNNEL |
+                                   NETIF_F_GSO_UDP_TUNNEL_CSUM |
+                                   NETIF_F_GSO_PARTIAL;
+               dev->features    |= NETIF_F_GSO_UDP_TUNNEL |
+                                   NETIF_F_GSO_UDP_TUNNEL_CSUM |
+                                   NETIF_F_GSO_PARTIAL;
+               dev->gso_partial_features = NETIF_F_GSO_UDP_TUNNEL_CSUM;
+               dev->hw_enc_features = NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
+                                      NETIF_F_RXCSUM |
+                                      NETIF_F_TSO | NETIF_F_TSO6 |
+                                      NETIF_F_GSO_UDP_TUNNEL |
+                                      NETIF_F_GSO_UDP_TUNNEL_CSUM |
+                                      NETIF_F_GSO_PARTIAL;
+       }
+
        dev->vlan_features = dev->hw_features;
 
        dev->hw_features |= NETIF_F_RXCSUM | NETIF_F_RXHASH;
@@ -3483,16 +3484,6 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
                priv->rss_hash_fn = ETH_RSS_HASH_TOP;
        }
 
-       if (mdev->dev->caps.tunnel_offload_mode == MLX4_TUNNEL_OFFLOAD_MODE_VXLAN) {
-               dev->hw_features |= NETIF_F_GSO_UDP_TUNNEL |
-                                   NETIF_F_GSO_UDP_TUNNEL_CSUM |
-                                   NETIF_F_GSO_PARTIAL;
-               dev->features    |= NETIF_F_GSO_UDP_TUNNEL |
-                                   NETIF_F_GSO_UDP_TUNNEL_CSUM |
-                                   NETIF_F_GSO_PARTIAL;
-               dev->gso_partial_features = NETIF_F_GSO_UDP_TUNNEL_CSUM;
-       }
-
        /* MTU range: 68 - hw-specific max */
        dev->min_mtu = ETH_MIN_MTU;
        dev->max_mtu = priv->max_mtu;