Commit a831274a authored by Alexander Duyck's avatar Alexander Duyck Committed by David S. Miller

mlx4_en: Replace ndo_add/del_vxlan_port with ndo_add/del_udp_enc_port

This change replaces the network device operations for adding or removing a
VXLAN port with operations that are more generically defined to be used for
any UDP offload port but provide a type.  As such by just adding a line to
verify that the offload type is VXLAN we can maintain the same
functionality.

In addition I updated the socket address family check so that instead of
excluding IPv6 we instead abort of type is not IPv4.  This makes much more
sense as we should only be supporting IPv4 outer addresses on this
hardware.
Signed-off-by: default avatarAlexander Duyck <aduyck@mirantis.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b3a49557
...@@ -24,13 +24,6 @@ config MLX4_EN_DCB ...@@ -24,13 +24,6 @@ config MLX4_EN_DCB
If unsure, set to Y If unsure, set to Y
config MLX4_EN_VXLAN
bool "VXLAN offloads Support"
default y
depends on MLX4_EN && VXLAN && !(MLX4_EN=y && VXLAN=m)
---help---
Say Y here if you want to use VXLAN offloads in the driver.
config MLX4_CORE config MLX4_CORE
tristate tristate
depends on PCI depends on PCI
......
...@@ -1692,10 +1692,9 @@ int mlx4_en_start_port(struct net_device *dev) ...@@ -1692,10 +1692,9 @@ int mlx4_en_start_port(struct net_device *dev)
/* Schedule multicast task to populate multicast list */ /* Schedule multicast task to populate multicast list */
queue_work(mdev->workqueue, &priv->rx_mode_task); queue_work(mdev->workqueue, &priv->rx_mode_task);
#ifdef CONFIG_MLX4_EN_VXLAN
if (priv->mdev->dev->caps.tunnel_offload_mode == MLX4_TUNNEL_OFFLOAD_MODE_VXLAN) if (priv->mdev->dev->caps.tunnel_offload_mode == MLX4_TUNNEL_OFFLOAD_MODE_VXLAN)
vxlan_get_rx_port(dev); udp_tunnel_get_rx_info(dev);
#endif
priv->port_up = true; priv->port_up = true;
netif_tx_start_all_queues(dev); netif_tx_start_all_queues(dev);
netif_device_attach(dev); netif_device_attach(dev);
...@@ -2342,7 +2341,6 @@ static int mlx4_en_get_phys_port_id(struct net_device *dev, ...@@ -2342,7 +2341,6 @@ static int mlx4_en_get_phys_port_id(struct net_device *dev,
return 0; return 0;
} }
#ifdef CONFIG_MLX4_EN_VXLAN
static void mlx4_en_add_vxlan_offloads(struct work_struct *work) static void mlx4_en_add_vxlan_offloads(struct work_struct *work)
{ {
int ret; int ret;
...@@ -2392,15 +2390,19 @@ static void mlx4_en_del_vxlan_offloads(struct work_struct *work) ...@@ -2392,15 +2390,19 @@ static void mlx4_en_del_vxlan_offloads(struct work_struct *work)
} }
static void mlx4_en_add_vxlan_port(struct net_device *dev, static void mlx4_en_add_vxlan_port(struct net_device *dev,
sa_family_t sa_family, __be16 port) struct udp_tunnel_info *ti)
{ {
struct mlx4_en_priv *priv = netdev_priv(dev); struct mlx4_en_priv *priv = netdev_priv(dev);
__be16 port = ti->port;
__be16 current_port; __be16 current_port;
if (priv->mdev->dev->caps.tunnel_offload_mode != MLX4_TUNNEL_OFFLOAD_MODE_VXLAN) if (ti->type != UDP_TUNNEL_TYPE_VXLAN)
return; return;
if (sa_family == AF_INET6) if (ti->sa_family != AF_INET)
return;
if (priv->mdev->dev->caps.tunnel_offload_mode != MLX4_TUNNEL_OFFLOAD_MODE_VXLAN)
return; return;
current_port = priv->vxlan_port; current_port = priv->vxlan_port;
...@@ -2415,15 +2417,19 @@ static void mlx4_en_add_vxlan_port(struct net_device *dev, ...@@ -2415,15 +2417,19 @@ static void mlx4_en_add_vxlan_port(struct net_device *dev,
} }
static void mlx4_en_del_vxlan_port(struct net_device *dev, static void mlx4_en_del_vxlan_port(struct net_device *dev,
sa_family_t sa_family, __be16 port) struct udp_tunnel_info *ti)
{ {
struct mlx4_en_priv *priv = netdev_priv(dev); struct mlx4_en_priv *priv = netdev_priv(dev);
__be16 port = ti->port;
__be16 current_port; __be16 current_port;
if (priv->mdev->dev->caps.tunnel_offload_mode != MLX4_TUNNEL_OFFLOAD_MODE_VXLAN) if (ti->type != UDP_TUNNEL_TYPE_VXLAN)
return; return;
if (sa_family == AF_INET6) if (ti->sa_family != AF_INET)
return;
if (priv->mdev->dev->caps.tunnel_offload_mode != MLX4_TUNNEL_OFFLOAD_MODE_VXLAN)
return; return;
current_port = priv->vxlan_port; current_port = priv->vxlan_port;
...@@ -2453,7 +2459,6 @@ static netdev_features_t mlx4_en_features_check(struct sk_buff *skb, ...@@ -2453,7 +2459,6 @@ static netdev_features_t mlx4_en_features_check(struct sk_buff *skb,
return features; return features;
} }
#endif
static int mlx4_en_set_tx_maxrate(struct net_device *dev, int queue_index, u32 maxrate) static int mlx4_en_set_tx_maxrate(struct net_device *dev, int queue_index, u32 maxrate)
{ {
...@@ -2506,11 +2511,9 @@ static const struct net_device_ops mlx4_netdev_ops = { ...@@ -2506,11 +2511,9 @@ static const struct net_device_ops mlx4_netdev_ops = {
.ndo_rx_flow_steer = mlx4_en_filter_rfs, .ndo_rx_flow_steer = mlx4_en_filter_rfs,
#endif #endif
.ndo_get_phys_port_id = mlx4_en_get_phys_port_id, .ndo_get_phys_port_id = mlx4_en_get_phys_port_id,
#ifdef CONFIG_MLX4_EN_VXLAN .ndo_udp_tunnel_add = mlx4_en_add_vxlan_port,
.ndo_add_vxlan_port = mlx4_en_add_vxlan_port, .ndo_udp_tunnel_del = mlx4_en_del_vxlan_port,
.ndo_del_vxlan_port = mlx4_en_del_vxlan_port,
.ndo_features_check = mlx4_en_features_check, .ndo_features_check = mlx4_en_features_check,
#endif
.ndo_set_tx_maxrate = mlx4_en_set_tx_maxrate, .ndo_set_tx_maxrate = mlx4_en_set_tx_maxrate,
}; };
...@@ -2544,11 +2547,9 @@ static const struct net_device_ops mlx4_netdev_ops_master = { ...@@ -2544,11 +2547,9 @@ static const struct net_device_ops mlx4_netdev_ops_master = {
.ndo_rx_flow_steer = mlx4_en_filter_rfs, .ndo_rx_flow_steer = mlx4_en_filter_rfs,
#endif #endif
.ndo_get_phys_port_id = mlx4_en_get_phys_port_id, .ndo_get_phys_port_id = mlx4_en_get_phys_port_id,
#ifdef CONFIG_MLX4_EN_VXLAN .ndo_udp_tunnel_add = mlx4_en_add_vxlan_port,
.ndo_add_vxlan_port = mlx4_en_add_vxlan_port, .ndo_udp_tunnel_del = mlx4_en_del_vxlan_port,
.ndo_del_vxlan_port = mlx4_en_del_vxlan_port,
.ndo_features_check = mlx4_en_features_check, .ndo_features_check = mlx4_en_features_check,
#endif
.ndo_set_tx_maxrate = mlx4_en_set_tx_maxrate, .ndo_set_tx_maxrate = mlx4_en_set_tx_maxrate,
}; };
...@@ -2839,10 +2840,8 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, ...@@ -2839,10 +2840,8 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
INIT_WORK(&priv->linkstate_task, mlx4_en_linkstate); INIT_WORK(&priv->linkstate_task, mlx4_en_linkstate);
INIT_DELAYED_WORK(&priv->stats_task, mlx4_en_do_get_stats); INIT_DELAYED_WORK(&priv->stats_task, mlx4_en_do_get_stats);
INIT_DELAYED_WORK(&priv->service_task, mlx4_en_service_task); INIT_DELAYED_WORK(&priv->service_task, mlx4_en_service_task);
#ifdef CONFIG_MLX4_EN_VXLAN
INIT_WORK(&priv->vxlan_add_task, mlx4_en_add_vxlan_offloads); INIT_WORK(&priv->vxlan_add_task, mlx4_en_add_vxlan_offloads);
INIT_WORK(&priv->vxlan_del_task, mlx4_en_del_vxlan_offloads); INIT_WORK(&priv->vxlan_del_task, mlx4_en_del_vxlan_offloads);
#endif
#ifdef CONFIG_RFS_ACCEL #ifdef CONFIG_RFS_ACCEL
INIT_LIST_HEAD(&priv->filters); INIT_LIST_HEAD(&priv->filters);
spin_lock_init(&priv->filters_lock); spin_lock_init(&priv->filters_lock);
......
...@@ -545,10 +545,8 @@ struct mlx4_en_priv { ...@@ -545,10 +545,8 @@ struct mlx4_en_priv {
struct work_struct linkstate_task; struct work_struct linkstate_task;
struct delayed_work stats_task; struct delayed_work stats_task;
struct delayed_work service_task; struct delayed_work service_task;
#ifdef CONFIG_MLX4_EN_VXLAN
struct work_struct vxlan_add_task; struct work_struct vxlan_add_task;
struct work_struct vxlan_del_task; struct work_struct vxlan_del_task;
#endif
struct mlx4_en_perf_stats pstats; struct mlx4_en_perf_stats pstats;
struct mlx4_en_pkt_stats pkstats; struct mlx4_en_pkt_stats pkstats;
struct mlx4_en_counter_stats pf_stats; struct mlx4_en_counter_stats pf_stats;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment