This patch implements the nvgre encap action in DV flow for MLX5 PMD.
Signed-off-by: Dekel Peled <dekelp@mellanox.com>
---
drivers/net/mlx5/mlx5_flow.h | 4 ++++
drivers/net/mlx5/mlx5_flow_dv.c | 27 ++++++++++++++++++++-------
2 files changed, 24 insertions(+), 7 deletions(-)
@@ -94,10 +94,14 @@
#define MLX5_FLOW_ACTION_SET_MAC_DST (1u << 21)
#define MLX5_FLOW_ACTION_VXLAN_ENCAP (1u << 22)
#define MLX5_FLOW_ACTION_VXLAN_DECAP (1u << 23)
+#define MLX5_FLOW_ACTION_NVGRE_ENCAP (1u << 24)
#define MLX5_FLOW_FATE_ACTIONS \
(MLX5_FLOW_ACTION_DROP | MLX5_FLOW_ACTION_QUEUE | MLX5_FLOW_ACTION_RSS)
+#define MLX5_FLOW_ENCAP_ACTIONS \
+ (MLX5_FLOW_ACTION_VXLAN_ENCAP | MLX5_FLOW_ACTION_NVGRE_ENCAP)
+
#ifndef IPPROTO_MPLS
#define IPPROTO_MPLS 137
#endif
@@ -103,7 +103,7 @@
/**
* Validate the L2 encap action.
- * Used for VXLAN encap action.
+ * Used for VXLAN and NVGRE encap actions.
*
* @param[in] action_flags
* Holds the actions detected until now.
@@ -131,7 +131,7 @@
return rte_flow_error_set(error, EINVAL,
RTE_FLOW_ERROR_TYPE_ACTION, NULL,
"can't drop and encap in same flow");
- if (action_flags & (MLX5_FLOW_ACTION_VXLAN_ENCAP |
+ if (action_flags & (MLX5_FLOW_ENCAP_ACTIONS |
MLX5_FLOW_ACTION_VXLAN_DECAP))
return rte_flow_error_set(error, EINVAL,
RTE_FLOW_ERROR_TYPE_ACTION, NULL,
@@ -172,7 +172,7 @@
return rte_flow_error_set(error, EINVAL,
RTE_FLOW_ERROR_TYPE_ACTION, NULL,
"can't drop and decap in same flow");
- if (action_flags & (MLX5_FLOW_ACTION_VXLAN_ENCAP |
+ if (action_flags & (MLX5_FLOW_ENCAP_ACTIONS |
MLX5_FLOW_ACTION_VXLAN_DECAP))
return rte_flow_error_set(error, EINVAL,
RTE_FLOW_ERROR_TYPE_ACTION, NULL,
@@ -397,7 +397,7 @@
/**
* Convert L2 encap action to DV specification.
- * Used for VXLAN encap action.
+ * Used for VXLAN and NVGRE encap actions.
*
* @param[in] dev
* Pointer to rte_eth_dev structure.
@@ -421,7 +421,11 @@
size_t size = 0;
int convert_result = 0;
- encap_data = ((const struct rte_flow_action_vxlan_encap *)
+ if (action->type == RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP)
+ encap_data = ((const struct rte_flow_action_vxlan_encap *)
+ action->conf)->definition;
+ else
+ encap_data = ((const struct rte_flow_action_nvgre_encap *)
action->conf)->definition;
convert_result = flow_dv_convert_encap_data(encap_data, buf,
&size, error);
@@ -714,12 +718,17 @@
++actions_n;
break;
case RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP:
+ case RTE_FLOW_ACTION_TYPE_NVGRE_ENCAP:
ret = flow_dv_validate_action_l2_encap(action_flags,
actions, attr,
error);
if (ret < 0)
return ret;
- action_flags |= MLX5_FLOW_ACTION_VXLAN_ENCAP;
+ action_flags |= actions->type ==
+ RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP ?
+ MLX5_FLOW_ACTION_VXLAN_ENCAP :
+ MLX5_FLOW_ACTION_NVGRE_ENCAP;
+
++actions_n;
break;
case RTE_FLOW_ACTION_TYPE_VXLAN_DECAP:
@@ -1505,6 +1514,7 @@
flow->actions |= MLX5_FLOW_ACTION_RSS;
break;
case RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP:
+ case RTE_FLOW_ACTION_TYPE_NVGRE_ENCAP:
dev_flow->dv.actions[actions_n].type =
MLX5DV_FLOW_ACTION_IBV_FLOW_ACTION;
dev_flow->dv.actions[actions_n].action =
@@ -1514,7 +1524,10 @@
return -rte_errno;
dev_flow->dv.verbs_action =
dev_flow->dv.actions[actions_n].action;
- flow->actions |= MLX5_FLOW_ACTION_VXLAN_ENCAP;
+ flow->actions |= action->type ==
+ RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP ?
+ MLX5_FLOW_ACTION_VXLAN_ENCAP :
+ MLX5_FLOW_ACTION_NVGRE_ENCAP;
actions_n++;
break;
case RTE_FLOW_ACTION_TYPE_VXLAN_DECAP: