Cloud filter replacement is not supported in multi-driver mode, so
tunnel flows that need it (MPLS, GTP, QinQ, L4 port) always failed to
install. The failure also marked the tunnel state as needing a device
reset, which blocked all other tunnel flows.
Do not initialize the engines for these tunnel types in multi-driver
mode.
Fixes: 28a3d1c89167 ("net/i40e: reimplement tunnel parsers")
Signed-off-by: Anatoly Burakov <[email protected]>
---
drivers/net/intel/i40e/i40e_flow_tunnel.c | 34 ++++++++++++++++++++---
1 file changed, 30 insertions(+), 4 deletions(-)
diff --git a/drivers/net/intel/i40e/i40e_flow_tunnel.c
b/drivers/net/intel/i40e/i40e_flow_tunnel.c
index 237678ab8c2..d74f46705f7 100644
--- a/drivers/net/intel/i40e/i40e_flow_tunnel.c
+++ b/drivers/net/intel/i40e/i40e_flow_tunnel.c
@@ -1883,6 +1883,20 @@ i40e_tunnel_flow_engine_init(const struct ci_flow_engine
*engine __rte_unused,
return tunnel_priv->state == NULL ? -ENOMEM : 0;
}
+static int
+i40e_tunnel_replace_flow_engine_init(const struct ci_flow_engine *engine,
+ struct rte_eth_dev_data *dev_data,
+ void *priv)
+{
+ struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev_data->dev_private);
+
+ /* tunnel filter replacement is not supported in multi-driver mode */
+ if (pf->support_multi_driver)
+ return -ENOTSUP;
+
+ return i40e_tunnel_flow_engine_init(engine, dev_data, priv);
+}
+
static void
i40e_tunnel_flow_engine_uninit(const struct ci_flow_engine *engine
__rte_unused,
void *priv)
@@ -1903,6 +1917,18 @@ static const struct ci_flow_engine_ops
i40e_flow_engine_tunnel_ops = {
.flow_uninstall = i40e_tunnel_flow_uninstall,
};
+/* for tunnel types that require tunnel filter replacement */
+static const struct ci_flow_engine_ops i40e_flow_engine_tunnel_replace_ops = {
+ .engine_init = i40e_tunnel_replace_flow_engine_init,
+ .engine_uninit = i40e_tunnel_flow_engine_uninit,
+ .ctx_init = i40e_tunnel_ctx_init,
+ .ctx_to_flow = i40e_tunnel_ctx_to_flow,
+ .flow_register = i40e_tunnel_flow_register,
+ .flow_unregister = i40e_tunnel_flow_unregister,
+ .flow_install = i40e_tunnel_flow_install,
+ .flow_uninstall = i40e_tunnel_flow_uninstall,
+};
+
const struct ci_flow_engine i40e_flow_engine_tunnel_nvgre = {
.name = "i40e_tunnel_nvgre",
.ops = &i40e_flow_engine_tunnel_ops,
@@ -1923,7 +1949,7 @@ const struct ci_flow_engine i40e_flow_engine_tunnel_vxlan
= {
const struct ci_flow_engine i40e_flow_engine_tunnel_mpls = {
.name = "i40e_tunnel_mpls",
- .ops = &i40e_flow_engine_tunnel_ops,
+ .ops = &i40e_flow_engine_tunnel_replace_ops,
.ctx_size = sizeof(struct i40e_tunnel_ctx),
.flow_size = sizeof(struct i40e_tunnel_flow),
.priv_size = sizeof(struct i40e_tunnel_priv),
@@ -1932,7 +1958,7 @@ const struct ci_flow_engine i40e_flow_engine_tunnel_mpls
= {
const struct ci_flow_engine i40e_flow_engine_tunnel_gtp = {
.name = "i40e_tunnel_gtp",
- .ops = &i40e_flow_engine_tunnel_ops,
+ .ops = &i40e_flow_engine_tunnel_replace_ops,
.ctx_size = sizeof(struct i40e_tunnel_ctx),
.flow_size = sizeof(struct i40e_tunnel_flow),
.priv_size = sizeof(struct i40e_tunnel_priv),
@@ -1941,7 +1967,7 @@ const struct ci_flow_engine i40e_flow_engine_tunnel_gtp =
{
const struct ci_flow_engine i40e_flow_engine_tunnel_l4 = {
.name = "i40e_tunnel_l4",
- .ops = &i40e_flow_engine_tunnel_ops,
+ .ops = &i40e_flow_engine_tunnel_replace_ops,
.ctx_size = sizeof(struct i40e_tunnel_ctx),
.flow_size = sizeof(struct i40e_tunnel_flow),
.priv_size = sizeof(struct i40e_tunnel_priv),
@@ -1950,7 +1976,7 @@ const struct ci_flow_engine i40e_flow_engine_tunnel_l4 = {
const struct ci_flow_engine i40e_flow_engine_tunnel_qinq = {
.name = "i40e_tunnel_qinq",
- .ops = &i40e_flow_engine_tunnel_ops,
+ .ops = &i40e_flow_engine_tunnel_replace_ops,
.ctx_size = sizeof(struct i40e_tunnel_ctx),
.flow_size = sizeof(struct i40e_tunnel_flow),
.priv_size = sizeof(struct i40e_tunnel_priv),
--
2.52.0