dpdk: add support for Mellanox ConnectX-5 devices
Change-Id: I3ed2834a326eac50a7cb4faa592f42fd06325d5a Signed-off-by: Damjan Marion <damarion@cisco.com>
This commit is contained in:

committed by
Dave Barach

parent
ce359db3b6
commit
0f60ff8af3
@ -25,7 +25,7 @@ DPDK_MLX5_PMD ?= n
|
||||
B := $(DPDK_BUILD_DIR)
|
||||
I := $(DPDK_INSTALL_DIR)
|
||||
DPDK_VERSION ?= 17.02
|
||||
PKG_SUFFIX ?= vpp2
|
||||
PKG_SUFFIX ?= vpp3
|
||||
DPDK_BASE_URL ?= http://fast.dpdk.org/rel
|
||||
DPDK_TARBALL := dpdk-$(DPDK_VERSION).tar.xz
|
||||
DPDK_TAR_URL := $(DPDK_BASE_URL)/$(DPDK_TARBALL)
|
||||
|
@ -0,0 +1,135 @@
|
||||
diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
|
||||
index 879da5e..2b4345a 100644
|
||||
--- a/drivers/net/mlx5/mlx5.h
|
||||
+++ b/drivers/net/mlx5/mlx5.h
|
||||
@@ -197,6 +197,8 @@ struct mlx5_secondary_data {
|
||||
int mlx5_is_secondary(void);
|
||||
int priv_get_ifname(const struct priv *, char (*)[IF_NAMESIZE]);
|
||||
int priv_ifreq(const struct priv *, int req, struct ifreq *);
|
||||
+int priv_is_ib_cntr(const char *);
|
||||
+int priv_get_cntr_sysfs(struct priv *, const char *, uint64_t *);
|
||||
int priv_get_num_vfs(struct priv *, uint16_t *);
|
||||
int priv_get_mtu(struct priv *, uint16_t *);
|
||||
int priv_set_flags(struct priv *, unsigned int, unsigned int);
|
||||
diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c
|
||||
index 2145965..6b64f44 100644
|
||||
--- a/drivers/net/mlx5/mlx5_ethdev.c
|
||||
+++ b/drivers/net/mlx5/mlx5_ethdev.c
|
||||
@@ -234,6 +234,23 @@ struct priv *
|
||||
}
|
||||
|
||||
/**
|
||||
+ * Check if the counter is located on ib counters file.
|
||||
+ *
|
||||
+ * @param[in] cntr
|
||||
+ * Counter name.
|
||||
+ *
|
||||
+ * @return
|
||||
+ * 1 if counter is located on ib counters file , 0 otherwise.
|
||||
+ */
|
||||
+int
|
||||
+priv_is_ib_cntr(const char *cntr)
|
||||
+{
|
||||
+ if (!strcmp(cntr, "out_of_buffer"))
|
||||
+ return 1;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
* Read from sysfs entry.
|
||||
*
|
||||
* @param[in] priv
|
||||
@@ -260,10 +277,15 @@ struct priv *
|
||||
if (priv_get_ifname(priv, &ifname))
|
||||
return -1;
|
||||
|
||||
- MKSTR(path, "%s/device/net/%s/%s", priv->ctx->device->ibdev_path,
|
||||
- ifname, entry);
|
||||
-
|
||||
- file = fopen(path, "rb");
|
||||
+ if (priv_is_ib_cntr(entry)) {
|
||||
+ MKSTR(path, "%s/ports/1/hw_counters/%s",
|
||||
+ priv->ctx->device->ibdev_path, entry);
|
||||
+ file = fopen(path, "rb");
|
||||
+ } else {
|
||||
+ MKSTR(path, "%s/device/net/%s/%s",
|
||||
+ priv->ctx->device->ibdev_path, ifname, entry);
|
||||
+ file = fopen(path, "rb");
|
||||
+ }
|
||||
if (file == NULL)
|
||||
return -1;
|
||||
ret = fread(buf, 1, size, file);
|
||||
@@ -469,6 +491,30 @@ struct priv *
|
||||
}
|
||||
|
||||
/**
|
||||
+ * Read device counter from sysfs.
|
||||
+ *
|
||||
+ * @param priv
|
||||
+ * Pointer to private structure.
|
||||
+ * @param name
|
||||
+ * Counter name.
|
||||
+ * @param[out] cntr
|
||||
+ * Counter output buffer.
|
||||
+ *
|
||||
+ * @return
|
||||
+ * 0 on success, -1 on failure and errno is set.
|
||||
+ */
|
||||
+int
|
||||
+priv_get_cntr_sysfs(struct priv *priv, const char *name, uint64_t *cntr)
|
||||
+{
|
||||
+ unsigned long ulong_ctr;
|
||||
+
|
||||
+ if (priv_get_sysfs_ulong(priv, name, &ulong_ctr) == -1)
|
||||
+ return -1;
|
||||
+ *cntr = ulong_ctr;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
* Set device MTU.
|
||||
*
|
||||
* @param priv
|
||||
diff --git a/drivers/net/mlx5/mlx5_stats.c b/drivers/net/mlx5/mlx5_stats.c
|
||||
index 20c957e..a48ebea 100644
|
||||
--- a/drivers/net/mlx5/mlx5_stats.c
|
||||
+++ b/drivers/net/mlx5/mlx5_stats.c
|
||||
@@ -125,6 +125,10 @@ struct mlx5_counter_ctrl {
|
||||
.dpdk_name = "tx_errors_phy",
|
||||
.ctr_name = "tx_errors_phy",
|
||||
},
|
||||
+ {
|
||||
+ .dpdk_name = "rx_out_of_buffer",
|
||||
+ .ctr_name = "out_of_buffer",
|
||||
+ },
|
||||
};
|
||||
|
||||
static const unsigned int xstats_n = RTE_DIM(mlx5_counters_init);
|
||||
@@ -159,9 +163,15 @@ struct mlx5_counter_ctrl {
|
||||
WARN("unable to read statistic values from device");
|
||||
return -1;
|
||||
}
|
||||
- for (i = 0; i != xstats_n; ++i)
|
||||
- stats[i] = (uint64_t)
|
||||
- et_stats->data[xstats_ctrl->dev_table_idx[i]];
|
||||
+ for (i = 0; i != xstats_n; ++i) {
|
||||
+ if (priv_is_ib_cntr(mlx5_counters_init[i].ctr_name))
|
||||
+ priv_get_cntr_sysfs(priv,
|
||||
+ mlx5_counters_init[i].ctr_name,
|
||||
+ &stats[i]);
|
||||
+ else
|
||||
+ stats[i] = (uint64_t)
|
||||
+ et_stats->data[xstats_ctrl->dev_table_idx[i]];
|
||||
+ }
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -233,6 +243,8 @@ struct mlx5_counter_ctrl {
|
||||
}
|
||||
}
|
||||
for (j = 0; j != xstats_n; ++j) {
|
||||
+ if (priv_is_ib_cntr(mlx5_counters_init[i].ctr_name))
|
||||
+ continue;
|
||||
if (xstats_ctrl->dev_table_idx[j] >= dev_stats_n) {
|
||||
WARN("counter \"%s\" is not recognized",
|
||||
mlx5_counters_init[j].dpdk_name);
|
@ -0,0 +1,22 @@
|
||||
diff --git a/drivers/net/mlx5/mlx5_stats.c b/drivers/net/mlx5/mlx5_stats.c
|
||||
index 20c957e..0c80e4f 100644
|
||||
--- a/drivers/net/mlx5/mlx5_stats.c
|
||||
+++ b/drivers/net/mlx5/mlx5_stats.c
|
||||
@@ -177,17 +177,12 @@ struct mlx5_counter_ctrl {
|
||||
struct mlx5_xstats_ctrl *xstats_ctrl = &priv->xstats_ctrl;
|
||||
unsigned int i;
|
||||
unsigned int j;
|
||||
- char ifname[IF_NAMESIZE];
|
||||
struct ifreq ifr;
|
||||
struct ethtool_drvinfo drvinfo;
|
||||
struct ethtool_gstrings *strings = NULL;
|
||||
unsigned int dev_stats_n;
|
||||
unsigned int str_sz;
|
||||
|
||||
- if (priv_get_ifname(priv, &ifname)) {
|
||||
- WARN("unable to get interface name");
|
||||
- return;
|
||||
- }
|
||||
/* How many statistics are available. */
|
||||
drvinfo.cmd = ETHTOOL_GDRVINFO;
|
||||
ifr.ifr_data = (caddr_t)&drvinfo;
|
@ -0,0 +1,87 @@
|
||||
diff --git a/drivers/net/mlx5/mlx5_stats.c b/drivers/net/mlx5/mlx5_stats.c
|
||||
index 0c80e4f..60ffbaa 100644
|
||||
--- a/drivers/net/mlx5/mlx5_stats.c
|
||||
+++ b/drivers/net/mlx5/mlx5_stats.c
|
||||
@@ -166,6 +166,29 @@ struct mlx5_counter_ctrl {
|
||||
}
|
||||
|
||||
/**
|
||||
+ * Query the number of statistics provided by ETHTOOL.
|
||||
+ *
|
||||
+ * @param priv
|
||||
+ * Pointer to private structure.
|
||||
+ *
|
||||
+ * @return
|
||||
+ * Number of statistics on success, -1 on error.
|
||||
+ */
|
||||
+static int
|
||||
+priv_ethtool_get_stats_n(struct priv *priv) {
|
||||
+ struct ethtool_drvinfo drvinfo;
|
||||
+ struct ifreq ifr;
|
||||
+
|
||||
+ drvinfo.cmd = ETHTOOL_GDRVINFO;
|
||||
+ ifr.ifr_data = (caddr_t)&drvinfo;
|
||||
+ if (priv_ifreq(priv, SIOCETHTOOL, &ifr) != 0) {
|
||||
+ WARN("unable to query number of statistics");
|
||||
+ return -1;
|
||||
+ }
|
||||
+ return drvinfo.n_stats;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
* Init the structures to read device counters.
|
||||
*
|
||||
* @param priv
|
||||
@@ -178,19 +201,11 @@ struct mlx5_counter_ctrl {
|
||||
unsigned int i;
|
||||
unsigned int j;
|
||||
struct ifreq ifr;
|
||||
- struct ethtool_drvinfo drvinfo;
|
||||
struct ethtool_gstrings *strings = NULL;
|
||||
unsigned int dev_stats_n;
|
||||
unsigned int str_sz;
|
||||
|
||||
- /* How many statistics are available. */
|
||||
- drvinfo.cmd = ETHTOOL_GDRVINFO;
|
||||
- ifr.ifr_data = (caddr_t)&drvinfo;
|
||||
- if (priv_ifreq(priv, SIOCETHTOOL, &ifr) != 0) {
|
||||
- WARN("unable to get driver info");
|
||||
- return;
|
||||
- }
|
||||
- dev_stats_n = drvinfo.n_stats;
|
||||
+ dev_stats_n = priv_ethtool_get_stats_n(priv);
|
||||
if (dev_stats_n < 1) {
|
||||
WARN("no extended statistics available");
|
||||
return;
|
||||
@@ -410,7 +425,15 @@ struct mlx5_counter_ctrl {
|
||||
int ret = xstats_n;
|
||||
|
||||
if (n >= xstats_n && stats) {
|
||||
+ struct mlx5_xstats_ctrl *xstats_ctrl = &priv->xstats_ctrl;
|
||||
+ int stats_n;
|
||||
+
|
||||
priv_lock(priv);
|
||||
+ stats_n = priv_ethtool_get_stats_n(priv);
|
||||
+ if (stats_n < 0)
|
||||
+ return -1;
|
||||
+ if (xstats_ctrl->stats_n != stats_n)
|
||||
+ priv_xstats_init(priv);
|
||||
ret = priv_xstats_get(priv, stats);
|
||||
priv_unlock(priv);
|
||||
}
|
||||
@@ -427,8 +450,15 @@ struct mlx5_counter_ctrl {
|
||||
mlx5_xstats_reset(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct priv *priv = mlx5_get_priv(dev);
|
||||
+ struct mlx5_xstats_ctrl *xstats_ctrl = &priv->xstats_ctrl;
|
||||
+ int stats_n;
|
||||
|
||||
priv_lock(priv);
|
||||
+ stats_n = priv_ethtool_get_stats_n(priv);
|
||||
+ if (stats_n < 0)
|
||||
+ return;
|
||||
+ if (xstats_ctrl->stats_n != stats_n)
|
||||
+ priv_xstats_init(priv);
|
||||
priv_xstats_reset(priv);
|
||||
priv_unlock(priv);
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
diff --git a/drivers/net/mlx5/mlx5_stats.c b/drivers/net/mlx5/mlx5_stats.c
|
||||
index 1953293..703f48c 100644
|
||||
--- a/drivers/net/mlx5/mlx5_stats.c
|
||||
+++ b/drivers/net/mlx5/mlx5_stats.c
|
||||
@@ -253,7 +253,7 @@ struct mlx5_counter_ctrl {
|
||||
}
|
||||
}
|
||||
for (j = 0; j != xstats_n; ++j) {
|
||||
- if (priv_is_ib_cntr(mlx5_counters_init[i].ctr_name))
|
||||
+ if (priv_is_ib_cntr(mlx5_counters_init[j].ctr_name))
|
||||
continue;
|
||||
if (xstats_ctrl->dev_table_idx[j] >= dev_stats_n) {
|
||||
WARN("counter \"%s\" is not recognized",
|
@ -0,0 +1,57 @@
|
||||
From 0866d640e42d6c54b2b3f15ebde9930e756ba4d5 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?N=C3=A9lio=20Laranjeiro?= <nelio.laranjeiro@6wind.com>
|
||||
Date: Wed, 22 Feb 2017 10:57:52 +0100
|
||||
Subject: [PATCH] net/mlx5: fix startup when flow cannot be applied
|
||||
|
||||
When flows cannot be re-applied due to configuration modifications, the
|
||||
start function should rollback the configuration done.
|
||||
|
||||
Fixes: 2097d0d1e2cc ("net/mlx5: support basic flow items and actions")
|
||||
Cc: stable@dpdk.org
|
||||
|
||||
Signed-off-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
|
||||
---
|
||||
drivers/net/mlx5/mlx5_trigger.c | 21 ++++++++++++++++-----
|
||||
1 file changed, 16 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/mlx5/mlx5_trigger.c b/drivers/net/mlx5/mlx5_trigger.c
|
||||
index 30addd2..0acbf28 100644
|
||||
--- a/drivers/net/mlx5/mlx5_trigger.c
|
||||
+++ b/drivers/net/mlx5/mlx5_trigger.c
|
||||
@@ -82,17 +82,28 @@ mlx5_dev_start(struct rte_eth_dev *dev)
|
||||
ERROR("%p: an error occurred while configuring hash RX queues:"
|
||||
" %s",
|
||||
(void *)priv, strerror(err));
|
||||
- /* Rollback. */
|
||||
- priv_special_flow_disable_all(priv);
|
||||
- priv_mac_addrs_disable(priv);
|
||||
- priv_destroy_hash_rxqs(priv);
|
||||
+ goto error;
|
||||
}
|
||||
if (dev->data->dev_conf.fdir_conf.mode != RTE_FDIR_MODE_NONE)
|
||||
priv_fdir_enable(priv);
|
||||
- priv_dev_interrupt_handler_install(priv, dev);
|
||||
err = priv_flow_start(priv);
|
||||
+ if (err) {
|
||||
+ priv->started = 0;
|
||||
+ ERROR("%p: an error occurred while configuring flows:"
|
||||
+ " %s",
|
||||
+ (void *)priv, strerror(err));
|
||||
+ goto error;
|
||||
+ }
|
||||
+ priv_dev_interrupt_handler_install(priv, dev);
|
||||
priv_xstats_init(priv);
|
||||
priv_unlock(priv);
|
||||
+ return 0;
|
||||
+error:
|
||||
+ /* Rollback. */
|
||||
+ priv_special_flow_disable_all(priv);
|
||||
+ priv_mac_addrs_disable(priv);
|
||||
+ priv_destroy_hash_rxqs(priv);
|
||||
+ priv_flow_stop(priv);
|
||||
return -err;
|
||||
}
|
||||
|
||||
--
|
||||
2.7.4
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,194 @@
|
||||
From f0dda2ab16635894b1e3836d0b960b9270a3b491 Mon Sep 17 00:00:00 2001
|
||||
From: Shahaf Shuler <shahafs@mellanox.com>
|
||||
Date: Thu, 2 Mar 2017 11:05:44 +0200
|
||||
Subject: [PATCH] net/mlx5: add hardware checksum offload for tunnel packets
|
||||
|
||||
Prior to this commit Tx checksum offload was supported only for the
|
||||
inner headers.
|
||||
This commit adds support for the hardware to compute the checksum for the
|
||||
outer headers as well.
|
||||
|
||||
The support is for tunneling protocols GRE and VXLAN.
|
||||
|
||||
Signed-off-by: Shahaf Shuler <shahafs@mellanox.com>
|
||||
Acked-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
|
||||
---
|
||||
doc/guides/nics/features/mlx5.ini | 2 ++
|
||||
doc/guides/nics/mlx5.rst | 3 ++-
|
||||
drivers/net/mlx5/mlx5.c | 7 +++++++
|
||||
drivers/net/mlx5/mlx5.h | 2 ++
|
||||
drivers/net/mlx5/mlx5_ethdev.c | 2 ++
|
||||
drivers/net/mlx5/mlx5_prm.h | 6 ++++++
|
||||
drivers/net/mlx5/mlx5_rxtx.c | 14 +++++++++++++-
|
||||
drivers/net/mlx5/mlx5_rxtx.h | 2 ++
|
||||
drivers/net/mlx5/mlx5_txq.c | 2 ++
|
||||
9 files changed, 38 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/doc/guides/nics/features/mlx5.ini b/doc/guides/nics/features/mlx5.ini
|
||||
index 8df25ce..1814f82 100644
|
||||
--- a/doc/guides/nics/features/mlx5.ini
|
||||
+++ b/doc/guides/nics/features/mlx5.ini
|
||||
@@ -27,6 +27,8 @@ CRC offload = Y
|
||||
VLAN offload = Y
|
||||
L3 checksum offload = Y
|
||||
L4 checksum offload = Y
|
||||
+Inner L3 checksum = Y
|
||||
+Inner L4 checksum = Y
|
||||
Packet type parsing = Y
|
||||
Basic stats = Y
|
||||
Stats per queue = Y
|
||||
diff --git a/doc/guides/nics/mlx5.rst b/doc/guides/nics/mlx5.rst
|
||||
index 9b0ba29..41f3a47 100644
|
||||
--- a/doc/guides/nics/mlx5.rst
|
||||
+++ b/doc/guides/nics/mlx5.rst
|
||||
@@ -91,13 +91,14 @@ Features
|
||||
- KVM and VMware ESX SR-IOV modes are supported.
|
||||
- RSS hash result is supported.
|
||||
- Hardware TSO.
|
||||
+- Hardware checksum TX offload for VXLAN and GRE.
|
||||
|
||||
Limitations
|
||||
-----------
|
||||
|
||||
- Inner RSS for VXLAN frames is not supported yet.
|
||||
- Port statistics through software counters only.
|
||||
-- Hardware checksum offloads for VXLAN inner header are not supported yet.
|
||||
+- Hardware checksum RX offloads for VXLAN inner header are not supported yet.
|
||||
- Secondary process RX is not supported.
|
||||
|
||||
Configuration
|
||||
diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c
|
||||
index 03ed3b3..6f42948 100644
|
||||
--- a/drivers/net/mlx5/mlx5.c
|
||||
+++ b/drivers/net/mlx5/mlx5.c
|
||||
@@ -375,6 +375,7 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
|
||||
struct ibv_device_attr device_attr;
|
||||
unsigned int sriov;
|
||||
unsigned int mps;
|
||||
+ unsigned int tunnel_en;
|
||||
int idx;
|
||||
int i;
|
||||
|
||||
@@ -429,12 +430,17 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
|
||||
* as all ConnectX-5 devices.
|
||||
*/
|
||||
switch (pci_dev->id.device_id) {
|
||||
+ case PCI_DEVICE_ID_MELLANOX_CONNECTX4:
|
||||
+ tunnel_en = 1;
|
||||
+ mps = 0;
|
||||
+ break;
|
||||
case PCI_DEVICE_ID_MELLANOX_CONNECTX4LX:
|
||||
case PCI_DEVICE_ID_MELLANOX_CONNECTX5:
|
||||
case PCI_DEVICE_ID_MELLANOX_CONNECTX5VF:
|
||||
case PCI_DEVICE_ID_MELLANOX_CONNECTX5EX:
|
||||
case PCI_DEVICE_ID_MELLANOX_CONNECTX5EXVF:
|
||||
mps = 1;
|
||||
+ tunnel_en = 1;
|
||||
break;
|
||||
default:
|
||||
mps = 0;
|
||||
@@ -539,6 +545,7 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
|
||||
priv->mtu = ETHER_MTU;
|
||||
priv->mps = mps; /* Enable MPW by default if supported. */
|
||||
priv->cqe_comp = 1; /* Enable compression by default. */
|
||||
+ priv->tunnel_en = tunnel_en;
|
||||
err = mlx5_args(priv, pci_dev->device.devargs);
|
||||
if (err) {
|
||||
ERROR("failed to process device arguments: %s",
|
||||
diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
|
||||
index 93f129b..870e01f 100644
|
||||
--- a/drivers/net/mlx5/mlx5.h
|
||||
+++ b/drivers/net/mlx5/mlx5.h
|
||||
@@ -127,6 +127,8 @@ struct priv {
|
||||
unsigned int cqe_comp:1; /* Whether CQE compression is enabled. */
|
||||
unsigned int pending_alarm:1; /* An alarm is pending. */
|
||||
unsigned int tso:1; /* Whether TSO is supported. */
|
||||
+ unsigned int tunnel_en:1;
|
||||
+ /* Whether Tx offloads for tunneled packets are supported. */
|
||||
unsigned int max_tso_payload_sz; /* Maximum TCP payload for TSO. */
|
||||
unsigned int txq_inline; /* Maximum packet size for inlining. */
|
||||
unsigned int txqs_inline; /* Queue number threshold for inlining. */
|
||||
diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c
|
||||
index 5542193..8be9e77 100644
|
||||
--- a/drivers/net/mlx5/mlx5_ethdev.c
|
||||
+++ b/drivers/net/mlx5/mlx5_ethdev.c
|
||||
@@ -695,6 +695,8 @@ mlx5_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
|
||||
DEV_TX_OFFLOAD_TCP_CKSUM);
|
||||
if (priv->tso)
|
||||
info->tx_offload_capa |= DEV_TX_OFFLOAD_TCP_TSO;
|
||||
+ if (priv->tunnel_en)
|
||||
+ info->tx_offload_capa |= DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
|
||||
if (priv_get_ifname(priv, &ifname) == 0)
|
||||
info->if_index = if_nametoindex(ifname);
|
||||
/* FIXME: RETA update/query API expects the callee to know the size of
|
||||
diff --git a/drivers/net/mlx5/mlx5_prm.h b/drivers/net/mlx5/mlx5_prm.h
|
||||
index 3318668..0a77f5b 100644
|
||||
--- a/drivers/net/mlx5/mlx5_prm.h
|
||||
+++ b/drivers/net/mlx5/mlx5_prm.h
|
||||
@@ -120,6 +120,12 @@
|
||||
/* Tunnel packet bit in the CQE. */
|
||||
#define MLX5_CQE_RX_TUNNEL_PACKET (1u << 0)
|
||||
|
||||
+/* Inner L3 checksum offload (Tunneled packets only). */
|
||||
+#define MLX5_ETH_WQE_L3_INNER_CSUM (1u << 4)
|
||||
+
|
||||
+/* Inner L4 checksum offload (Tunneled packets only). */
|
||||
+#define MLX5_ETH_WQE_L4_INNER_CSUM (1u << 5)
|
||||
+
|
||||
/* INVALID is used by packets matching no flow rules. */
|
||||
#define MLX5_FLOW_MARK_INVALID 0
|
||||
|
||||
diff --git a/drivers/net/mlx5/mlx5_rxtx.c b/drivers/net/mlx5/mlx5_rxtx.c
|
||||
index 98889f6..c2eb891 100644
|
||||
--- a/drivers/net/mlx5/mlx5_rxtx.c
|
||||
+++ b/drivers/net/mlx5/mlx5_rxtx.c
|
||||
@@ -443,7 +443,19 @@ mlx5_tx_burst(void *dpdk_txq, struct rte_mbuf **pkts, uint16_t pkts_n)
|
||||
/* Should we enable HW CKSUM offload */
|
||||
if (buf->ol_flags &
|
||||
(PKT_TX_IP_CKSUM | PKT_TX_TCP_CKSUM | PKT_TX_UDP_CKSUM)) {
|
||||
- cs_flags = MLX5_ETH_WQE_L3_CSUM | MLX5_ETH_WQE_L4_CSUM;
|
||||
+ const uint64_t is_tunneled = buf->ol_flags &
|
||||
+ (PKT_TX_TUNNEL_GRE |
|
||||
+ PKT_TX_TUNNEL_VXLAN);
|
||||
+
|
||||
+ if (is_tunneled && txq->tunnel_en) {
|
||||
+ cs_flags = MLX5_ETH_WQE_L3_INNER_CSUM |
|
||||
+ MLX5_ETH_WQE_L4_INNER_CSUM;
|
||||
+ if (buf->ol_flags & PKT_TX_OUTER_IP_CKSUM)
|
||||
+ cs_flags |= MLX5_ETH_WQE_L3_CSUM;
|
||||
+ } else {
|
||||
+ cs_flags = MLX5_ETH_WQE_L3_CSUM |
|
||||
+ MLX5_ETH_WQE_L4_CSUM;
|
||||
+ }
|
||||
}
|
||||
raw = ((uint8_t *)(uintptr_t)wqe) + 2 * MLX5_WQE_DWORD_SIZE;
|
||||
/* Replace the Ethernet type by the VLAN if necessary. */
|
||||
diff --git a/drivers/net/mlx5/mlx5_rxtx.h b/drivers/net/mlx5/mlx5_rxtx.h
|
||||
index 6b328cf..9669564 100644
|
||||
--- a/drivers/net/mlx5/mlx5_rxtx.h
|
||||
+++ b/drivers/net/mlx5/mlx5_rxtx.h
|
||||
@@ -256,6 +256,8 @@ struct txq {
|
||||
uint16_t max_inline; /* Multiple of RTE_CACHE_LINE_SIZE to inline. */
|
||||
uint16_t inline_en:1; /* When set inline is enabled. */
|
||||
uint16_t tso_en:1; /* When set hardware TSO is enabled. */
|
||||
+ uint16_t tunnel_en:1;
|
||||
+ /* When set TX offload for tunneled packets are supported. */
|
||||
uint32_t qp_num_8s; /* QP number shifted by 8. */
|
||||
volatile struct mlx5_cqe (*cqes)[]; /* Completion queue. */
|
||||
volatile void *wqes; /* Work queue (use volatile to write into). */
|
||||
diff --git a/drivers/net/mlx5/mlx5_txq.c b/drivers/net/mlx5/mlx5_txq.c
|
||||
index 995b763..9d0c00f 100644
|
||||
--- a/drivers/net/mlx5/mlx5_txq.c
|
||||
+++ b/drivers/net/mlx5/mlx5_txq.c
|
||||
@@ -356,6 +356,8 @@ txq_ctrl_setup(struct rte_eth_dev *dev, struct txq_ctrl *txq_ctrl,
|
||||
max_tso_inline);
|
||||
tmpl.txq.tso_en = 1;
|
||||
}
|
||||
+ if (priv->tunnel_en)
|
||||
+ tmpl.txq.tunnel_en = 1;
|
||||
tmpl.qp = ibv_exp_create_qp(priv->ctx, &attr.init);
|
||||
if (tmpl.qp == NULL) {
|
||||
ret = (errno ? errno : EINVAL);
|
||||
--
|
||||
2.7.4
|
||||
|
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user