On Thu, Apr 18, 2019 at 11:28:47AM +0000, Ori Kam wrote: > In current implementation the DV steering supported only NIC steering. > This commit adds the transfer attribute in order to create a matcher > on the FDB tabels. > > Signed-off-by: Ori Kam <or...@mellanox.com> > ---
Acked-by: Yongseok Koh <ys...@mellanox.com> > v2: > * Address ML comments. > --- > drivers/net/mlx5/mlx5_flow.c | 1 + > drivers/net/mlx5/mlx5_flow.h | 2 ++ > drivers/net/mlx5/mlx5_flow_dv.c | 22 ++++++++++++++++++---- > 3 files changed, 21 insertions(+), 4 deletions(-) > > diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c > index b1effda..8afb966 100644 > --- a/drivers/net/mlx5/mlx5_flow.c > +++ b/drivers/net/mlx5/mlx5_flow.c > @@ -2095,6 +2095,7 @@ uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev > *dev, int32_t priority, > flow = rte_calloc(__func__, 1, flow_size, 0); > flow->drv_type = flow_get_drv_type(dev, attr); > flow->ingress = attr->ingress; > + flow->transfer = attr->transfer; > assert(flow->drv_type > MLX5_FLOW_TYPE_MIN && > flow->drv_type < MLX5_FLOW_TYPE_MAX); > flow->queue = (void *)(flow + 1); > diff --git a/drivers/net/mlx5/mlx5_flow.h b/drivers/net/mlx5/mlx5_flow.h > index 85954c2..9d72024 100644 > --- a/drivers/net/mlx5/mlx5_flow.h > +++ b/drivers/net/mlx5/mlx5_flow.h > @@ -210,6 +210,7 @@ struct mlx5_flow_dv_matcher { > uint16_t crc; /**< CRC of key. */ > uint16_t priority; /**< Priority of matcher. */ > uint8_t egress; /**< Egress matcher. */ > + uint8_t transfer; /**< 1 if the flow is E-Switch flow. */ > uint32_t group; /**< The matcher group. */ > struct mlx5_flow_dv_match_params mask; /**< Matcher mask. */ > }; > @@ -382,6 +383,7 @@ struct rte_flow { > struct mlx5_fdir *fdir; /**< Pointer to associated FDIR if any. */ > uint8_t ingress; /**< 1 if the flow is ingress. */ > uint32_t group; /**< The group index. */ > + uint8_t transfer; /**< 1 if the flow is E-Switch flow. */ > }; > > typedef int (*mlx5_flow_validate_t)(struct rte_eth_dev *dev, > diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c > index e3d9aa2..182abb3 100644 > --- a/drivers/net/mlx5/mlx5_flow_dv.c > +++ b/drivers/net/mlx5/mlx5_flow_dv.c > @@ -3192,6 +3192,8 @@ struct field_modify_info modify_tcp[] = { > * Table id to use. > * @param[in] egress > * Direction of the table. > + * @param[in] transfer > + * E-Switch or NIC flow. > * @param[out] error > * pointer to error structure. > * > @@ -3201,6 +3203,7 @@ struct field_modify_info modify_tcp[] = { > static struct mlx5_flow_tbl_resource * > flow_dv_tbl_resource_get(struct rte_eth_dev *dev, > uint32_t table_id, uint8_t egress, > + uint8_t transfer, > struct rte_flow_error *error) > { > struct mlx5_priv *priv = dev->data->dev_private; > @@ -3208,7 +3211,12 @@ struct field_modify_info modify_tcp[] = { > struct mlx5_flow_tbl_resource *tbl; > > #ifdef HAVE_MLX5DV_DR > - if (egress) { > + if (transfer) { > + tbl = &sh->fdb_tbl[table_id]; > + if (!tbl->obj) > + tbl->obj = mlx5_glue->dr_create_flow_tbl > + (sh->fdb_ns, table_id); > + } else if (egress) { > tbl = &sh->tx_tbl[table_id]; > if (!tbl->obj) > tbl->obj = mlx5_glue->dr_create_flow_tbl > @@ -3230,7 +3238,9 @@ struct field_modify_info modify_tcp[] = { > #else > (void)error; > (void)tbl; > - if (egress) > + if (transfer) > + return &sh->fdb_tbl[table_id]; > + else if (egress) > return &sh->tx_tbl[table_id]; > else > return &sh->rx_tbl[table_id]; > @@ -3295,6 +3305,7 @@ struct field_modify_info modify_tcp[] = { > matcher->priority == cache_matcher->priority && > matcher->egress == cache_matcher->egress && > matcher->group == cache_matcher->group && > + matcher->transfer == cache_matcher->transfer && > !memcmp((const void *)matcher->mask.buf, > (const void *)cache_matcher->mask.buf, > cache_matcher->mask.size)) { > @@ -3316,7 +3327,8 @@ struct field_modify_info modify_tcp[] = { > RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL, > "cannot allocate matcher memory"); > tbl = flow_dv_tbl_resource_get(dev, matcher->group * MLX5_GROUP_FACTOR, > - matcher->egress, error); > + matcher->egress, matcher->transfer, > + error); > if (!tbl) { > rte_free(cache_matcher); > return rte_flow_error_set(error, ENOMEM, > @@ -3643,7 +3655,8 @@ struct field_modify_info modify_tcp[] = { > jump_data = action->conf; > tbl = flow_dv_tbl_resource_get(dev, jump_data->group * > MLX5_GROUP_FACTOR, > - attr->egress, error); > + attr->egress, > + attr->transfer, error); > if (!tbl) > return rte_flow_error_set > (error, errno, > @@ -3871,6 +3884,7 @@ struct field_modify_info modify_tcp[] = { > matcher.priority); > matcher.egress = attr->egress; > matcher.group = attr->group; > + matcher.transfer = attr->transfer; > if (flow_dv_matcher_register(dev, &matcher, dev_flow, error)) > return -rte_errno; > return 0; > -- > 1.8.3.1 >