Thanks, PSB. > -----Original Message----- > From: Shahaf Shuler > Sent: Monday, October 29, 2018 12:03 PM > To: Dekel Peled <dek...@mellanox.com>; Yongseok Koh > <ys...@mellanox.com> > Cc: dev@dpdk.org; Ori Kam <or...@mellanox.com> > Subject: RE: [dpdk-dev] [PATCH v6 3/6] net/mlx5: add VXLAN decap action to > Direct Verbs > > Thursday, October 25, 2018 11:08 PM, Dekel Peled: > > Subject: [dpdk-dev] [PATCH v6 3/6] net/mlx5: add VXLAN decap action to > > Direct Verbs > > > > This patch implements the VXLAN decap action in DV flow for MLX5 PMD. > > > > Signed-off-by: Dekel Peled <dek...@mellanox.com> > > --- > > drivers/net/mlx5/mlx5_flow.h | 1 + > > drivers/net/mlx5/mlx5_flow_dv.c | 103 > > ++++++++++++++++++++++++++++++++++++++-- > > 2 files changed, 100 insertions(+), 4 deletions(-) > > > > diff --git a/drivers/net/mlx5/mlx5_flow.h > > b/drivers/net/mlx5/mlx5_flow.h index 6e92afe..3795644 100644 > > --- a/drivers/net/mlx5/mlx5_flow.h > > +++ b/drivers/net/mlx5/mlx5_flow.h > > @@ -93,6 +93,7 @@ > > #define MLX5_FLOW_ACTION_SET_MAC_SRC (1u << 20) #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_FATE_ACTIONS \ > > (MLX5_FLOW_ACTION_DROP | MLX5_FLOW_ACTION_QUEUE | > > MLX5_FLOW_ACTION_RSS) diff --git a/drivers/net/mlx5/mlx5_flow_dv.c > > b/drivers/net/mlx5/mlx5_flow_dv.c index 14110c5..e84a2b6 100644 > > --- a/drivers/net/mlx5/mlx5_flow_dv.c > > +++ b/drivers/net/mlx5/mlx5_flow_dv.c > > @@ -131,11 +131,12 @@ > > 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_ACTION_VXLAN_ENCAP | > > + MLX5_FLOW_ACTION_VXLAN_DECAP)) > > return rte_flow_error_set(error, EINVAL, > > RTE_FLOW_ERROR_TYPE_ACTION, > > NULL, > > - "can only have a single encap" > > - " action in a flow"); > > + "can only have a single encap or" > > + " decap action in a flow"); > > if (attr->ingress) > > return rte_flow_error_set(error, ENOTSUP, > > > > RTE_FLOW_ERROR_TYPE_ATTR_INGRESS, @@ -146,6 +147,47 @@ } > > > > /** > > + * Validate the L2 decap action. > > + * Used for VXLAN decap action. > > Same like before
I will remove it. > > > + * > > + * @param[in] action_flags > > + * Holds the actions detected until now. > > + * @param[in] action > > + * Pointer to the decap action. > > + * @param[in] attr > > + * Pointer to flow attributes > > + * @param[out] error > > + * Pointer to error structure. > > + * > > + * @return > > + * 0 on success, a negative errno value otherwise and rte_errno is set. > > + */ > > +static int > > +flow_dv_validate_action_l2_decap(uint64_t action_flags, > > + const struct rte_flow_action *action __rte_unused, > > + const struct rte_flow_attr *attr, > > + struct rte_flow_error *error) > > +{ > > + if (action_flags & MLX5_FLOW_ACTION_DROP) > > + 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 | > > + MLX5_FLOW_ACTION_VXLAN_DECAP)) > > + return rte_flow_error_set(error, EINVAL, > > + RTE_FLOW_ERROR_TYPE_ACTION, > > NULL, > > + "can only have a single encap or" > > + " decap action in a flow"); > > + if (attr->egress) > > + return rte_flow_error_set(error, ENOTSUP, > > + > > RTE_FLOW_ERROR_TYPE_ATTR_EGRESS, > > + NULL, > > + "decap action not supported for " > > + "egress"); > > + return 0; > > +} > > + > > +/** > > * Get the size of specific rte_flow_item_type > > * > > * @param[in] item_type > > @@ -396,6 +438,38 @@ > > } > > > > /** > > + * Convert L2 decap action to DV specification. > > + * Used for VXLAN decap action. > > Same I will remove it. > > > + * > > + * @param[in] dev > > + * Pointer to rte_eth_dev structure. > > + * @param[in] action > > + * Pointer to action structure. > > + * @param[out] error > > + * Pointer to the error structure. > > + * > > + * @return > > + * Pointer to action on success, NULL otherwise and rte_errno is set. > > + */ > > +static struct ibv_flow_action * > > +flow_dv_create_action_l2_decap(struct rte_eth_dev *dev, > > + const struct rte_flow_action *action __rte_unused, > > + struct rte_flow_error *error) > > +{ > > + struct ibv_flow_action *verbs_action = NULL; > > + struct priv *priv = dev->data->dev_private; > > + > > + verbs_action = mlx5_glue- > > >dv_create_flow_action_packet_reformat > > + (priv->ctx, 0, NULL, > > + > > MLX5DV_FLOW_ACTION_PACKET_REFORMAT_TYPE_L2_TUNNEL_TO_L2, > > + MLX5DV_FLOW_TABLE_TYPE_NIC_RX); > > + if (!verbs_action) > > + rte_flow_error_set(error, EINVAL, > > RTE_FLOW_ERROR_TYPE_ACTION, > > + NULL, "cannot create L2 decap action"); > > + return verbs_action; > > +} > > + > > +/** > > * Verify the @p attributes will be correctly understood by the NIC and > store > > * them in the @p flow if everything is correct. > > * > > @@ -648,7 +722,15 @@ > > action_flags |= > > MLX5_FLOW_ACTION_VXLAN_ENCAP; > > ++actions_n; > > break; > > - > > + case RTE_FLOW_ACTION_TYPE_VXLAN_DECAP: > > + ret = > > flow_dv_validate_action_l2_decap(action_flags, > > + actions, attr, > > + error); > > + if (ret < 0) > > + return ret; > > + action_flags |= > > MLX5_FLOW_ACTION_VXLAN_DECAP; > > + ++actions_n; > > + break; > > default: > > return rte_flow_error_set(error, ENOTSUP, > > > > RTE_FLOW_ERROR_TYPE_ACTION, > > @@ -1435,6 +1517,19 @@ > > flow->actions |= MLX5_FLOW_ACTION_VXLAN_ENCAP; > > actions_n++; > > break; > > + case RTE_FLOW_ACTION_TYPE_VXLAN_DECAP: > > + dev_flow->dv.actions[actions_n].type = > > + MLX5DV_FLOW_ACTION_IBV_FLOW_ACTION; > > + dev_flow->dv.actions[actions_n].action = > > + flow_dv_create_action_l2_decap(dev, > > action, > > + error); > > + if (!(dev_flow->dv.actions[actions_n].action)) > > + return -rte_errno; > > + dev_flow->dv.verbs_action = > > + dev_flow->dv.actions[actions_n].action; > > + flow->actions |= MLX5_FLOW_ACTION_VXLAN_DECAP; > > + actions_n++; > > + break; > > default: > > break; > > } > > -- > > 1.8.3.1