|
@@ -31,12 +31,7 @@
|
|
|
/* Local includes */
|
|
|
#include "i40e.h"
|
|
|
#include "i40e_diag.h"
|
|
|
-#if IS_ENABLED(CONFIG_VXLAN)
|
|
|
-#include <net/vxlan.h>
|
|
|
-#endif
|
|
|
-#if IS_ENABLED(CONFIG_GENEVE)
|
|
|
-#include <net/geneve.h>
|
|
|
-#endif
|
|
|
+#include <net/udp_tunnel.h>
|
|
|
|
|
|
const char i40e_driver_name[] = "i40e";
|
|
|
static const char i40e_driver_string[] =
|
|
@@ -5342,14 +5337,7 @@ int i40e_open(struct net_device *netdev)
|
|
|
TCP_FLAG_CWR) >> 16);
|
|
|
wr32(&pf->hw, I40E_GLLAN_TSOMSK_L, be32_to_cpu(TCP_FLAG_CWR) >> 16);
|
|
|
|
|
|
-#ifdef CONFIG_I40E_VXLAN
|
|
|
- vxlan_get_rx_port(netdev);
|
|
|
-#endif
|
|
|
-#ifdef CONFIG_I40E_GENEVE
|
|
|
- if (pf->flags & I40E_FLAG_GENEVE_OFFLOAD_CAPABLE)
|
|
|
- geneve_get_rx_port(netdev);
|
|
|
-#endif
|
|
|
-
|
|
|
+ udp_tunnel_get_rx_info(netdev);
|
|
|
i40e_notify_client_of_netdev_open(vsi);
|
|
|
|
|
|
return 0;
|
|
@@ -7057,7 +7045,6 @@ static void i40e_handle_mdd_event(struct i40e_pf *pf)
|
|
|
**/
|
|
|
static void i40e_sync_udp_filters_subtask(struct i40e_pf *pf)
|
|
|
{
|
|
|
-#if IS_ENABLED(CONFIG_VXLAN) || IS_ENABLED(CONFIG_GENEVE)
|
|
|
struct i40e_hw *hw = &pf->hw;
|
|
|
i40e_status ret;
|
|
|
__be16 port;
|
|
@@ -7092,7 +7079,6 @@ static void i40e_sync_udp_filters_subtask(struct i40e_pf *pf)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-#endif
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -8628,7 +8614,6 @@ static int i40e_set_features(struct net_device *netdev,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-#if IS_ENABLED(CONFIG_VXLAN) || IS_ENABLED(CONFIG_GENEVE)
|
|
|
/**
|
|
|
* i40e_get_udp_port_idx - Lookup a possibly offloaded for Rx UDP port
|
|
|
* @pf: board private structure
|
|
@@ -8648,21 +8633,18 @@ static u8 i40e_get_udp_port_idx(struct i40e_pf *pf, __be16 port)
|
|
|
return i;
|
|
|
}
|
|
|
|
|
|
-#endif
|
|
|
-
|
|
|
-#if IS_ENABLED(CONFIG_VXLAN)
|
|
|
/**
|
|
|
- * i40e_add_vxlan_port - Get notifications about VXLAN ports that come up
|
|
|
+ * i40e_udp_tunnel_add - Get notifications about UDP tunnel ports that come up
|
|
|
* @netdev: This physical port's netdev
|
|
|
- * @sa_family: Socket Family that VXLAN is notifying us about
|
|
|
- * @port: New UDP port number that VXLAN started listening to
|
|
|
+ * @ti: Tunnel endpoint information
|
|
|
**/
|
|
|
-static void i40e_add_vxlan_port(struct net_device *netdev,
|
|
|
- sa_family_t sa_family, __be16 port)
|
|
|
+static void i40e_udp_tunnel_add(struct net_device *netdev,
|
|
|
+ struct udp_tunnel_info *ti)
|
|
|
{
|
|
|
struct i40e_netdev_priv *np = netdev_priv(netdev);
|
|
|
struct i40e_vsi *vsi = np->vsi;
|
|
|
struct i40e_pf *pf = vsi->back;
|
|
|
+ __be16 port = ti->port;
|
|
|
u8 next_idx;
|
|
|
u8 idx;
|
|
|
|
|
@@ -8670,7 +8652,7 @@ static void i40e_add_vxlan_port(struct net_device *netdev,
|
|
|
|
|
|
/* Check if port already exists */
|
|
|
if (idx < I40E_MAX_PF_UDP_OFFLOAD_PORTS) {
|
|
|
- netdev_info(netdev, "vxlan port %d already offloaded\n",
|
|
|
+ netdev_info(netdev, "port %d already offloaded\n",
|
|
|
ntohs(port));
|
|
|
return;
|
|
|
}
|
|
@@ -8679,131 +8661,75 @@ static void i40e_add_vxlan_port(struct net_device *netdev,
|
|
|
next_idx = i40e_get_udp_port_idx(pf, 0);
|
|
|
|
|
|
if (next_idx == I40E_MAX_PF_UDP_OFFLOAD_PORTS) {
|
|
|
- netdev_info(netdev, "maximum number of vxlan UDP ports reached, not adding port %d\n",
|
|
|
- ntohs(port));
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- /* New port: add it and mark its index in the bitmap */
|
|
|
- pf->udp_ports[next_idx].index = port;
|
|
|
- pf->udp_ports[next_idx].type = I40E_AQC_TUNNEL_TYPE_VXLAN;
|
|
|
- pf->pending_udp_bitmap |= BIT_ULL(next_idx);
|
|
|
- pf->flags |= I40E_FLAG_UDP_FILTER_SYNC;
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * i40e_del_vxlan_port - Get notifications about VXLAN ports that go away
|
|
|
- * @netdev: This physical port's netdev
|
|
|
- * @sa_family: Socket Family that VXLAN is notifying us about
|
|
|
- * @port: UDP port number that VXLAN stopped listening to
|
|
|
- **/
|
|
|
-static void i40e_del_vxlan_port(struct net_device *netdev,
|
|
|
- sa_family_t sa_family, __be16 port)
|
|
|
-{
|
|
|
- struct i40e_netdev_priv *np = netdev_priv(netdev);
|
|
|
- struct i40e_vsi *vsi = np->vsi;
|
|
|
- struct i40e_pf *pf = vsi->back;
|
|
|
- u8 idx;
|
|
|
-
|
|
|
- idx = i40e_get_udp_port_idx(pf, port);
|
|
|
-
|
|
|
- /* Check if port already exists */
|
|
|
- if (idx < I40E_MAX_PF_UDP_OFFLOAD_PORTS) {
|
|
|
- /* if port exists, set it to 0 (mark for deletion)
|
|
|
- * and make it pending
|
|
|
- */
|
|
|
- pf->udp_ports[idx].index = 0;
|
|
|
- pf->pending_udp_bitmap |= BIT_ULL(idx);
|
|
|
- pf->flags |= I40E_FLAG_UDP_FILTER_SYNC;
|
|
|
- } else {
|
|
|
- netdev_warn(netdev, "vxlan port %d was not found, not deleting\n",
|
|
|
- ntohs(port));
|
|
|
- }
|
|
|
-}
|
|
|
-#endif
|
|
|
-
|
|
|
-#if IS_ENABLED(CONFIG_GENEVE)
|
|
|
-/**
|
|
|
- * i40e_add_geneve_port - Get notifications about GENEVE ports that come up
|
|
|
- * @netdev: This physical port's netdev
|
|
|
- * @sa_family: Socket Family that GENEVE is notifying us about
|
|
|
- * @port: New UDP port number that GENEVE started listening to
|
|
|
- **/
|
|
|
-static void i40e_add_geneve_port(struct net_device *netdev,
|
|
|
- sa_family_t sa_family, __be16 port)
|
|
|
-{
|
|
|
- struct i40e_netdev_priv *np = netdev_priv(netdev);
|
|
|
- struct i40e_vsi *vsi = np->vsi;
|
|
|
- struct i40e_pf *pf = vsi->back;
|
|
|
- u8 next_idx;
|
|
|
- u8 idx;
|
|
|
-
|
|
|
- if (!(pf->flags & I40E_FLAG_GENEVE_OFFLOAD_CAPABLE))
|
|
|
- return;
|
|
|
-
|
|
|
- idx = i40e_get_udp_port_idx(pf, port);
|
|
|
-
|
|
|
- /* Check if port already exists */
|
|
|
- if (idx < I40E_MAX_PF_UDP_OFFLOAD_PORTS) {
|
|
|
- netdev_info(netdev, "udp port %d already offloaded\n",
|
|
|
+ netdev_info(netdev, "maximum number of offloaded UDP ports reached, not adding port %d\n",
|
|
|
ntohs(port));
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- /* Now check if there is space to add the new port */
|
|
|
- next_idx = i40e_get_udp_port_idx(pf, 0);
|
|
|
-
|
|
|
- if (next_idx == I40E_MAX_PF_UDP_OFFLOAD_PORTS) {
|
|
|
- netdev_info(netdev, "maximum number of UDP ports reached, not adding port %d\n",
|
|
|
- ntohs(port));
|
|
|
+ switch (ti->type) {
|
|
|
+ case UDP_TUNNEL_TYPE_VXLAN:
|
|
|
+ pf->udp_ports[next_idx].type = I40E_AQC_TUNNEL_TYPE_VXLAN;
|
|
|
+ break;
|
|
|
+ case UDP_TUNNEL_TYPE_GENEVE:
|
|
|
+ if (!(pf->flags & I40E_FLAG_GENEVE_OFFLOAD_CAPABLE))
|
|
|
+ return;
|
|
|
+ pf->udp_ports[next_idx].type = I40E_AQC_TUNNEL_TYPE_NGE;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
/* New port: add it and mark its index in the bitmap */
|
|
|
pf->udp_ports[next_idx].index = port;
|
|
|
- pf->udp_ports[next_idx].type = I40E_AQC_TUNNEL_TYPE_NGE;
|
|
|
pf->pending_udp_bitmap |= BIT_ULL(next_idx);
|
|
|
pf->flags |= I40E_FLAG_UDP_FILTER_SYNC;
|
|
|
-
|
|
|
- dev_info(&pf->pdev->dev, "adding geneve port %d\n", ntohs(port));
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * i40e_del_geneve_port - Get notifications about GENEVE ports that go away
|
|
|
+ * i40e_udp_tunnel_del - Get notifications about UDP tunnel ports that go away
|
|
|
* @netdev: This physical port's netdev
|
|
|
- * @sa_family: Socket Family that GENEVE is notifying us about
|
|
|
- * @port: UDP port number that GENEVE stopped listening to
|
|
|
+ * @ti: Tunnel endpoint information
|
|
|
**/
|
|
|
-static void i40e_del_geneve_port(struct net_device *netdev,
|
|
|
- sa_family_t sa_family, __be16 port)
|
|
|
+static void i40e_udp_tunnel_del(struct net_device *netdev,
|
|
|
+ struct udp_tunnel_info *ti)
|
|
|
{
|
|
|
struct i40e_netdev_priv *np = netdev_priv(netdev);
|
|
|
struct i40e_vsi *vsi = np->vsi;
|
|
|
struct i40e_pf *pf = vsi->back;
|
|
|
+ __be16 port = ti->port;
|
|
|
u8 idx;
|
|
|
|
|
|
- if (!(pf->flags & I40E_FLAG_GENEVE_OFFLOAD_CAPABLE))
|
|
|
- return;
|
|
|
-
|
|
|
idx = i40e_get_udp_port_idx(pf, port);
|
|
|
|
|
|
/* Check if port already exists */
|
|
|
- if (idx < I40E_MAX_PF_UDP_OFFLOAD_PORTS) {
|
|
|
- /* if port exists, set it to 0 (mark for deletion)
|
|
|
- * and make it pending
|
|
|
- */
|
|
|
- pf->udp_ports[idx].index = 0;
|
|
|
- pf->pending_udp_bitmap |= BIT_ULL(idx);
|
|
|
- pf->flags |= I40E_FLAG_UDP_FILTER_SYNC;
|
|
|
+ if (idx >= I40E_MAX_PF_UDP_OFFLOAD_PORTS)
|
|
|
+ goto not_found;
|
|
|
|
|
|
- dev_info(&pf->pdev->dev, "deleting geneve port %d\n",
|
|
|
- ntohs(port));
|
|
|
- } else {
|
|
|
- netdev_warn(netdev, "geneve port %d was not found, not deleting\n",
|
|
|
- ntohs(port));
|
|
|
+ switch (ti->type) {
|
|
|
+ case UDP_TUNNEL_TYPE_VXLAN:
|
|
|
+ if (pf->udp_ports[idx].type != I40E_AQC_TUNNEL_TYPE_VXLAN)
|
|
|
+ goto not_found;
|
|
|
+ break;
|
|
|
+ case UDP_TUNNEL_TYPE_GENEVE:
|
|
|
+ if (pf->udp_ports[idx].type != I40E_AQC_TUNNEL_TYPE_NGE)
|
|
|
+ goto not_found;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ goto not_found;
|
|
|
}
|
|
|
+
|
|
|
+ /* if port exists, set it to 0 (mark for deletion)
|
|
|
+ * and make it pending
|
|
|
+ */
|
|
|
+ pf->udp_ports[idx].index = 0;
|
|
|
+ pf->pending_udp_bitmap |= BIT_ULL(idx);
|
|
|
+ pf->flags |= I40E_FLAG_UDP_FILTER_SYNC;
|
|
|
+
|
|
|
+ return;
|
|
|
+not_found:
|
|
|
+ netdev_warn(netdev, "UDP port %d was not found, not deleting\n",
|
|
|
+ ntohs(port));
|
|
|
}
|
|
|
-#endif
|
|
|
|
|
|
static int i40e_get_phys_port_id(struct net_device *netdev,
|
|
|
struct netdev_phys_item_id *ppid)
|
|
@@ -9033,14 +8959,8 @@ static const struct net_device_ops i40e_netdev_ops = {
|
|
|
.ndo_set_vf_link_state = i40e_ndo_set_vf_link_state,
|
|
|
.ndo_set_vf_spoofchk = i40e_ndo_set_vf_spoofchk,
|
|
|
.ndo_set_vf_trust = i40e_ndo_set_vf_trust,
|
|
|
-#if IS_ENABLED(CONFIG_VXLAN)
|
|
|
- .ndo_add_vxlan_port = i40e_add_vxlan_port,
|
|
|
- .ndo_del_vxlan_port = i40e_del_vxlan_port,
|
|
|
-#endif
|
|
|
-#if IS_ENABLED(CONFIG_GENEVE)
|
|
|
- .ndo_add_geneve_port = i40e_add_geneve_port,
|
|
|
- .ndo_del_geneve_port = i40e_del_geneve_port,
|
|
|
-#endif
|
|
|
+ .ndo_udp_tunnel_add = i40e_udp_tunnel_add,
|
|
|
+ .ndo_udp_tunnel_del = i40e_udp_tunnel_del,
|
|
|
.ndo_get_phys_port_id = i40e_get_phys_port_id,
|
|
|
.ndo_fdb_add = i40e_ndo_fdb_add,
|
|
|
.ndo_features_check = i40e_features_check,
|
|
@@ -10689,12 +10609,8 @@ static void i40e_print_features(struct i40e_pf *pf)
|
|
|
}
|
|
|
if (pf->flags & I40E_FLAG_DCB_CAPABLE)
|
|
|
i += snprintf(&buf[i], REMAIN(i), " DCB");
|
|
|
-#if IS_ENABLED(CONFIG_VXLAN)
|
|
|
i += snprintf(&buf[i], REMAIN(i), " VxLAN");
|
|
|
-#endif
|
|
|
-#if IS_ENABLED(CONFIG_GENEVE)
|
|
|
i += snprintf(&buf[i], REMAIN(i), " Geneve");
|
|
|
-#endif
|
|
|
if (pf->flags & I40E_FLAG_PTP)
|
|
|
i += snprintf(&buf[i], REMAIN(i), " PTP");
|
|
|
#ifdef I40E_FCOE
|