> -----Original Message-----
> From: Ori Kam
> Sent: Thursday, March 28, 2019 18:33
> To: Matan Azrad <ma...@mellanox.com>; Yongseok Koh
> <ys...@mellanox.com>; Shahaf Shuler <shah...@mellanox.com>
> Cc: dev@dpdk.org; Ori Kam <or...@mellanox.com>; Slava Ovsiienko
> <viachesl...@mellanox.com>
> Subject: [PATCH v2 2/3] net/mlx5: add Direct Rules API
> 
> Adds calls to the Direct Rules API inside the glue functions.
> Due to difference in parameters between the Direct Rules and Direct Verbs
> some of the glue functions API was updated.
> 
> Signed-off-by: Ori Kam <or...@mellanox.com>
Acked-by: Viacheslav Ovsiienko <viachesl...@mellanox.com>

> 
> ---
>  drivers/net/mlx5/Makefile       |   5 ++
>  drivers/net/mlx5/mlx5.c         |  16 ++++
>  drivers/net/mlx5/mlx5.h         |  15 ++++
>  drivers/net/mlx5/mlx5_flow.c    |   1 +
>  drivers/net/mlx5/mlx5_flow.h    |   6 +-
>  drivers/net/mlx5/mlx5_flow_dv.c | 103 ++++++++++++++++++++----
>  drivers/net/mlx5/mlx5_glue.c    | 170
> ++++++++++++++++++++++++++++++++++------
>  drivers/net/mlx5/mlx5_glue.h    |  31 +++++---
>  drivers/net/mlx5/mlx5_prm.h     |  24 +++++-
>  9 files changed, 318 insertions(+), 53 deletions(-)
> 
> diff --git a/drivers/net/mlx5/Makefile b/drivers/net/mlx5/Makefile index
> c326494..3dd7e38 100644
> --- a/drivers/net/mlx5/Makefile
> +++ b/drivers/net/mlx5/Makefile
> @@ -156,6 +156,11 @@ mlx5_autoconf.h.new: $(RTE_SDK)/buildtools/auto-
> config-h.sh
>               func mlx5dv_create_flow_action_packet_reformat \
>               $(AUTOCONF_OUTPUT)
>       $Q sh -- '$<' '$@' \
> +             HAVE_MLX5DV_DR \
> +             infiniband/mlx5dv.h \
> +             enum MLX5DV_DR_NS_TYPE_TERMINATING \
> +             $(AUTOCONF_OUTPUT)
> +     $Q sh -- '$<' '$@' \
>               HAVE_IBV_DEVX_OBJ \
>               infiniband/mlx5dv.h \
>               func mlx5dv_devx_obj_create \
> diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c index
> 7d1a21e..70e37b5 100644
> --- a/drivers/net/mlx5/mlx5.c
> +++ b/drivers/net/mlx5/mlx5.c
> @@ -1362,6 +1362,22 @@ struct mlx5_dev_spawn_data {
>                       priv->tcf_context = NULL;
>               }
>       }
> +#ifdef HAVE_MLX5DV_DR
> +             priv->rx_ns = mlx5dv_dr_create_ns
> +                     (sh->ctx,
> MLX5DV_DR_NS_DOMAIN_INGRESS_BYPASS);
> +             if (priv->rx_ns == NULL) {
> +                     DRV_LOG(ERR, "mlx5dv_dr_create_ns failed");
> +                     err = errno;
> +                     goto error;
> +             }
> +             priv->tx_ns = mlx5dv_dr_create_ns(sh->ctx,
> +
> MLX5DV_DR_NS_DOMAIN_EGRESS_BYPASS);
> +             if (priv->tx_ns == NULL) {
> +                     DRV_LOG(ERR, "mlx5dv_dr_create_ns failed");
> +                     err = errno;
> +                     goto error;
> +             }
> +#endif
>       TAILQ_INIT(&priv->flows);
>       TAILQ_INIT(&priv->ctrl_flows);
>       /* Hint libmlx5 to use PMD allocator for data plane resources */ diff -
> -git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index
> b587359..73f6f0d 100644
> --- a/drivers/net/mlx5/mlx5.h
> +++ b/drivers/net/mlx5/mlx5.h
> @@ -219,6 +219,15 @@ struct mlx5_ibv_shared {
>       struct mlx5_ibv_shared_port port[]; /* per device port data array. */
> };
> 
> +/* Table structure. */
> +struct mlx5_flow_tbl_resource {
> +     void *obj; /**< Pointer to DR table object. */
> +     rte_atomic32_t refcnt; /**< Reference counter. */ };
> +
> +#define MLX5_MAX_TABLES 1024
> +#define MLX5_GROUP_FACTOR 1
> +
>  struct mlx5_priv {
>       LIST_ENTRY(mlx5_priv) mem_event_cb;
>       /**< Called by memory event callback. */ @@ -289,6 +298,12 @@
> struct mlx5_priv {
>       /* UAR same-page access control required in 32bit implementations.
> */  #endif
>       struct mlx5_flow_tcf_context *tcf_context; /* TC flower context. */
> +     void *rx_ns; /* RX Direct Rules name space handle. */
> +     struct mlx5_flow_tbl_resource rx_tbl[MLX5_MAX_TABLES];
> +     /* RX Direct Rules tables. */
> +     void *tx_ns; /* TX Direct Rules name space handle. */
> +     struct mlx5_flow_tbl_resource tx_tbl[MLX5_MAX_TABLES];
> +     /* TX Direct Rules tables/ */
>  };
> 
>  #define PORT_ID(priv) ((priv)->dev_data->port_id) diff --git
> a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c index
> d09fdff..40d6818 100644
> --- a/drivers/net/mlx5/mlx5_flow.c
> +++ b/drivers/net/mlx5/mlx5_flow.c
> @@ -2084,6 +2084,7 @@ uint32_t mlx5_flow_adjust_priority(struct
> rte_eth_dev *dev, int32_t priority,
>               flow_size += RTE_ALIGN_CEIL(sizeof(uint16_t), sizeof(void
> *));
>       flow = rte_calloc(__func__, 1, flow_size, 0);
>       flow->drv_type = flow_get_drv_type(dev, attr);
> +     flow->ingress = attr->ingress;
>       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 4f69ae2..8ba37a0 100644
> --- a/drivers/net/mlx5/mlx5_flow.h
> +++ b/drivers/net/mlx5/mlx5_flow.h
> @@ -204,6 +204,7 @@ struct mlx5_flow_dv_matcher {
>       uint16_t crc; /**< CRC of key. */
>       uint16_t priority; /**< Priority of matcher. */
>       uint8_t egress; /**< Egress matcher. */
> +     uint32_t group; /**< The matcher group. */
>       struct mlx5_flow_dv_match_params mask; /**< Matcher mask. */  };
> 
> @@ -220,6 +221,7 @@ struct mlx5_flow_dv_encap_decap_resource {
>       size_t size;
>       uint8_t reformat_type;
>       uint8_t ft_type;
> +     uint64_t flags; /**< Flags for RDMA API. */
>  };
> 
>  /* Tag resource structure. */
> @@ -348,7 +350,7 @@ struct mlx5_flow_counter {
>  /* Flow structure. */
>  struct rte_flow {
>       TAILQ_ENTRY(rte_flow) next; /**< Pointer to the next flow structure.
> */
> -     enum mlx5_flow_drv_type drv_type; /**< Drvier type. */
> +     enum mlx5_flow_drv_type drv_type; /**< Driver type. */
>       struct mlx5_flow_counter *counter; /**< Holds flow counter. */
>       struct mlx5_flow_dv_tag_resource *tag_resource;
>       /**< pointer to the tag action. */
> @@ -360,6 +362,8 @@ struct rte_flow {
>       uint64_t actions;
>       /**< Bit-fields of detected actions, see MLX5_FLOW_ACTION_*. */
>       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. */
>  };
> 
>  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 b0c50a7..6e4f6c4 100644
> --- a/drivers/net/mlx5/mlx5_flow_dv.c
> +++ b/drivers/net/mlx5/mlx5_flow_dv.c
> @@ -805,11 +805,20 @@ struct field_modify_info modify_tcp[] = {  {
>       struct mlx5_priv *priv = dev->data->dev_private;
>       struct mlx5_flow_dv_encap_decap_resource *cache_resource;
> +     struct rte_flow *flow = dev_flow->flow;
> +     struct mlx5dv_dr_ns *ns;
> +
> +     resource->flags = flow->group ? 0 : 1;
> +     if (flow->ingress)
> +             ns = priv->rx_ns;
> +     else
> +             ns = priv->tx_ns;
> 
>       /* Lookup a matching resource from cache. */
>       LIST_FOREACH(cache_resource, &priv->encaps_decaps, next) {
>               if (resource->reformat_type == cache_resource-
> >reformat_type &&
>                   resource->ft_type == cache_resource->ft_type &&
> +                 resource->flags == cache_resource->flags &&
>                   resource->size == cache_resource->size &&
>                   !memcmp((const void *)resource->buf,
>                           (const void *)cache_resource->buf, @@ -831,10
> +840,10 @@ struct field_modify_info modify_tcp[] = {
>       *cache_resource = *resource;
>       cache_resource->verbs_action =
>               mlx5_glue->dv_create_flow_action_packet_reformat
> -                     (priv->sh->ctx, cache_resource->size,
> -                      (cache_resource->size ? cache_resource->buf :
> NULL),
> -                      cache_resource->reformat_type,
> -                      cache_resource->ft_type);
> +                     (priv->sh->ctx, cache_resource->reformat_type,
> +                      cache_resource->ft_type, ns, cache_resource->flags,
> +                      cache_resource->size,
> +                      (cache_resource->size ? cache_resource->buf :
> NULL));
>       if (!cache_resource->verbs_action) {
>               rte_free(cache_resource);
>               return rte_flow_error_set(error, ENOMEM, @@ -1438,6
> +1447,10 @@ struct field_modify_info modify_tcp[] = {
>       struct mlx5_priv *priv = dev->data->dev_private;
>       struct mlx5_flow_dv_modify_hdr_resource *cache_resource;
> 
> +     struct mlx5dv_dr_ns *ns =
> +             resource->ft_type == MLX5DV_FLOW_TABLE_TYPE_NIC_TX  ?
> +             priv->tx_ns : priv->rx_ns;
> +
>       /* Lookup a matching resource from cache. */
>       LIST_FOREACH(cache_resource, &priv->modify_cmds, next) {
>               if (resource->ft_type == cache_resource->ft_type && @@ -
> 1463,11 +1476,11 @@ struct field_modify_info modify_tcp[] = {
>       *cache_resource = *resource;
>       cache_resource->verbs_action =
>               mlx5_glue->dv_create_flow_action_modify_header
> -                                     (priv->sh->ctx,
> +                                     (priv->sh->ctx, cache_resource-
> >ft_type,
> +                                      ns, 0,
>                                        cache_resource->actions_num *
>                                        sizeof(cache_resource->actions[0]),
> -                                      (uint64_t *)cache_resource->actions,
> -                                      cache_resource->ft_type);
> +                                      (uint64_t *)cache_resource-
> >actions);
>       if (!cache_resource->verbs_action) {
>               rte_free(cache_resource);
>               return rte_flow_error_set(error, ENOMEM, @@ -1592,11
> +1605,13 @@ struct field_modify_info modify_tcp[] = {
>       struct mlx5_priv *priv = dev->data->dev_private;
>       uint32_t priority_max = priv->config.flow_prio - 1;
> 
> +#ifdef HAVE_MLX5DV_DR
>       if (attributes->group)
>               return rte_flow_error_set(error, ENOTSUP,
> 
> RTE_FLOW_ERROR_TYPE_ATTR_GROUP,
>                                         NULL,
>                                         "groups is not supported");
> +#endif
>       if (attributes->priority != MLX5_FLOW_PRIO_RSVD &&
>           attributes->priority >= priority_max)
>               return rte_flow_error_set(error, ENOTSUP, @@ -2169,11
> +2184,13 @@ struct field_modify_info modify_tcp[] = {
>   *   Flow pattern to translate.
>   * @param[in] inner
>   *   Item is inner pattern.
> + * @param[in] group
> + *   The group to insert the rule.
>   */
>  static void
>  flow_dv_translate_item_ipv4(void *matcher, void *key,
>                           const struct rte_flow_item *item,
> -                         int inner)
> +                         int inner, uint32_t group)
>  {
>       const struct rte_flow_item_ipv4 *ipv4_m = item->mask;
>       const struct rte_flow_item_ipv4 *ipv4_v = item->spec; @@ -2200,7
> +2217,10 @@ struct field_modify_info modify_tcp[] = {
>                                        outer_headers);
>               headers_v = MLX5_ADDR_OF(fte_match_param, key,
> outer_headers);
>       }
> -     MLX5_SET(fte_match_set_lyr_2_4, headers_m, ip_version, 0xf);
> +     if (group == 0)
> +             MLX5_SET(fte_match_set_lyr_2_4, headers_m, ip_version,
> 0xf);
> +     else
> +             MLX5_SET(fte_match_set_lyr_2_4, headers_m, ip_version,
> 0x4);
>       MLX5_SET(fte_match_set_lyr_2_4, headers_v, ip_version, 4);
>       if (!ipv4_v)
>               return;
> @@ -2242,11 +2262,13 @@ struct field_modify_info modify_tcp[] = {
>   *   Flow pattern to translate.
>   * @param[in] inner
>   *   Item is inner pattern.
> + * @param[in] group
> + *   The group to insert the rule.
>   */
>  static void
>  flow_dv_translate_item_ipv6(void *matcher, void *key,
>                           const struct rte_flow_item *item,
> -                         int inner)
> +                         int inner, uint32_t group)
>  {
>       const struct rte_flow_item_ipv6 *ipv6_m = item->mask;
>       const struct rte_flow_item_ipv6 *ipv6_v = item->spec; @@ -2283,7
> +2305,10 @@ struct field_modify_info modify_tcp[] = {
>                                        outer_headers);
>               headers_v = MLX5_ADDR_OF(fte_match_param, key,
> outer_headers);
>       }
> -     MLX5_SET(fte_match_set_lyr_2_4, headers_m, ip_version, 0xf);
> +     if (group == 0)
> +             MLX5_SET(fte_match_set_lyr_2_4, headers_m, ip_version,
> 0xf);
> +     else
> +             MLX5_SET(fte_match_set_lyr_2_4, headers_m, ip_version,
> 0x6);
>       MLX5_SET(fte_match_set_lyr_2_4, headers_v, ip_version, 6);
>       if (!ipv6_v)
>               return;
> @@ -2723,7 +2748,11 @@ struct field_modify_info modify_tcp[] = {
>       match_criteria_enable |=
>               (!HEADER_IS_ZERO(match_criteria, misc_parameters_2)) <<
>               MLX5_MATCH_CRITERIA_ENABLE_MISC2_BIT;
> -
> +#ifdef HAVE_MLX5DV_DR
> +     match_criteria_enable |=
> +             (!HEADER_IS_ZERO(match_criteria, misc_parameters_3)) <<
> +             MLX5_MATCH_CRITERIA_ENABLE_MISC3_BIT;
> +#endif
>       return match_criteria_enable;
>  }
> 
> @@ -2754,12 +2783,14 @@ struct field_modify_info modify_tcp[] = {
>               .type = IBV_FLOW_ATTR_NORMAL,
>               .match_mask = (void *)&matcher->mask,
>       };
> +     struct mlx5_flow_tbl_resource *tbl = NULL;
> 
>       /* Lookup from cache. */
>       LIST_FOREACH(cache_matcher, &priv->matchers, next) {
>               if (matcher->crc == cache_matcher->crc &&
>                   matcher->priority == cache_matcher->priority &&
>                   matcher->egress == cache_matcher->egress &&
> +                 matcher->group == cache_matcher->group &&
>                   !memcmp((const void *)matcher->mask.buf,
>                           (const void *)cache_matcher->mask.buf,
>                           cache_matcher->mask.size)) {
> @@ -2774,6 +2805,27 @@ struct field_modify_info modify_tcp[] = {
>                       return 0;
>               }
>       }
> +#ifdef HAVE_MLX5DV_DR
> +     if (matcher->egress) {
> +             tbl = &priv->tx_tbl[matcher->group];
> +             if (!tbl->obj)
> +                     tbl->obj = mlx5_glue->dr_create_flow_tbl
> +                             (priv->tx_ns,
> +                              matcher->group * MLX5_GROUP_FACTOR);
> +     } else {
> +             tbl = &priv->rx_tbl[matcher->group];
> +             if (!tbl->obj)
> +                     tbl->obj = mlx5_glue->dr_create_flow_tbl
> +                             (priv->rx_ns,
> +                              matcher->group * MLX5_GROUP_FACTOR);
> +     }
> +     if (!tbl->obj)
> +             return rte_flow_error_set(error, ENOMEM,
> +
> RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
> +                                       NULL, "cannot create table");
> +
> +     rte_atomic32_inc(&tbl->refcnt);
> +#endif
>       /* Register new matcher. */
>       cache_matcher = rte_calloc(__func__, 1, sizeof(*cache_matcher), 0);
>       if (!cache_matcher)
> @@ -2787,9 +2839,16 @@ struct field_modify_info modify_tcp[] = {
>       if (matcher->egress)
>               dv_attr.flags |= IBV_FLOW_ATTR_FLAGS_EGRESS;
>       cache_matcher->matcher_object =
> -             mlx5_glue->dv_create_flow_matcher(priv->sh->ctx,
> &dv_attr);
> +             mlx5_glue->dv_create_flow_matcher(priv->sh->ctx,
> &dv_attr,
> +                                               tbl->obj);
>       if (!cache_matcher->matcher_object) {
>               rte_free(cache_matcher);
> +#ifdef HAVE_MLX5DV_DR
> +             if (rte_atomic32_dec_and_test(&tbl->refcnt)) {
> +                     mlx5_glue->dr_destroy_flow_tbl(tbl->obj);
> +                     tbl->obj = NULL;
> +             }
> +#endif
>               return rte_flow_error_set(error, ENOMEM,
> 
> RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
>                                         NULL, "cannot create matcher");
> @@ -2801,6 +2860,7 @@ struct field_modify_info modify_tcp[] = {
>               cache_matcher->priority,
>               cache_matcher->egress ? "tx" : "rx", (void *)cache_matcher,
>               rte_atomic32_read(&cache_matcher->refcnt));
> +     rte_atomic32_inc(&tbl->refcnt);
>       return 0;
>  }
> 
> @@ -3222,7 +3282,7 @@ struct field_modify_info modify_tcp[] = {
>                       break;
>               case RTE_FLOW_ITEM_TYPE_IPV4:
>                       flow_dv_translate_item_ipv4(match_mask,
> match_value,
> -                                                 items, tunnel);
> +                                                 items, tunnel, attr->group);
>                       matcher.priority = MLX5_PRIORITY_MAP_L3;
>                       dev_flow->dv.hash_fields |=
>                               mlx5_flow_hashfields_adjust
> @@ -3234,7 +3294,7 @@ struct field_modify_info modify_tcp[] = {
>                       break;
>               case RTE_FLOW_ITEM_TYPE_IPV6:
>                       flow_dv_translate_item_ipv6(match_mask,
> match_value,
> -                                                 items, tunnel);
> +                                                 items, tunnel, attr->group);
>                       matcher.priority = MLX5_PRIORITY_MAP_L3;
>                       dev_flow->dv.hash_fields |=
>                               mlx5_flow_hashfields_adjust
> @@ -3312,6 +3372,7 @@ struct field_modify_info modify_tcp[] = {
>       matcher.priority = mlx5_flow_adjust_priority(dev, priority,
>                                                    matcher.priority);
>       matcher.egress = attr->egress;
> +     matcher.group = attr->group;
>       if (flow_dv_matcher_register(dev, &matcher, dev_flow, error))
>               return -rte_errno;
>       return 0;
> @@ -3427,6 +3488,8 @@ struct field_modify_info modify_tcp[] = {
>                       struct mlx5_flow *flow)
>  {
>       struct mlx5_flow_dv_matcher *matcher = flow->dv.matcher;
> +     struct mlx5_priv *priv = dev->data->dev_private;
> +     struct mlx5_flow_tbl_resource *tbl;
> 
>       assert(matcher->matcher_object);
>       DRV_LOG(DEBUG, "port %u matcher %p: refcnt %d--", @@ -3436,6
> +3499,14 @@ struct field_modify_info modify_tcp[] = {
>               claim_zero(mlx5_glue->dv_destroy_flow_matcher
>                          (matcher->matcher_object));
>               LIST_REMOVE(matcher, next);
> +             if (matcher->egress)
> +                     tbl = &priv->tx_tbl[matcher->group];
> +             else
> +                     tbl = &priv->rx_tbl[matcher->group];
> +             if (rte_atomic32_dec_and_test(&tbl->refcnt)) {
> +                     mlx5_glue->dr_destroy_flow_tbl(tbl->obj);
> +                     tbl->obj = NULL;
> +             }
>               rte_free(matcher);
>               DRV_LOG(DEBUG, "port %u matcher %p: removed",
>                       dev->data->port_id, (void *)matcher); @@ -3525,7
> +3596,7 @@ struct field_modify_info modify_tcp[] = {
>       LIST_FOREACH(dev_flow, &flow->dev_flows, next) {
>               dv = &dev_flow->dv;
>               if (dv->flow) {
> -                     claim_zero(mlx5_glue->destroy_flow(dv->flow));
> +                     claim_zero(mlx5_glue->dv_destroy_flow(dv->flow));
>                       dv->flow = NULL;
>               }
>               if (dv->hrxq) {
> diff --git a/drivers/net/mlx5/mlx5_glue.c b/drivers/net/mlx5/mlx5_glue.c
> index cfd939d..f509f85 100644
> --- a/drivers/net/mlx5/mlx5_glue.c
> +++ b/drivers/net/mlx5/mlx5_glue.c
> @@ -178,6 +178,9 @@
>  mlx5_glue_destroy_flow_action(void *action)  {  #ifdef
> HAVE_IBV_FLOW_DV_SUPPORT
> +#ifdef HAVE_MLX5DV_DR
> +     return mlx5dv_dr_destroy_action(action); #else
>       struct mlx5dv_flow_action_attr *attr = action;
>       int res = 0;
>       switch (attr->type) {
> @@ -189,6 +192,7 @@
>       }
>       free(action);
>       return res;
> +#endif
>  #else
>       (void)action;
>       return ENOTSUP;
> @@ -365,6 +369,53 @@
>       return ibv_cq_ex_to_cq(cq);
>  }
> 
> +static void *
> +mlx5_glue_dr_create_flow_tbl(void *ns, uint32_t level) { #ifdef
> +HAVE_MLX5DV_DR
> +     return mlx5dv_dr_create_ft(ns, level); #else
> +     (void)ns;
> +     (void)level;
> +     return NULL;
> +#endif
> +}
> +
> +static int
> +mlx5_glue_dr_destroy_flow_tbl(void *tbl) { #ifdef HAVE_MLX5DV_DR
> +     return mlx5dv_dr_destroy_ft(tbl);
> +#else
> +     (void)tbl;
> +     return 0;
> +#endif
> +}
> +
> +static void *
> +mlx5_glue_dr_create_ns(struct ibv_context *ctx,
> +                    enum  mlx5dv_dr_ns_domain domain) { #ifdef
> HAVE_MLX5DV_DR
> +     return mlx5dv_dr_create_ns(ctx, domain); #else
> +     (void)ctx;
> +     (void)domain;
> +     return NULL;
> +#endif
> +}
> +
> +static int
> +mlx5_glue_dr_destroy_ns(void *ns)
> +{
> +#ifdef HAVE_MLX5DV_DR
> +     return mlx5dv_dr_destroy_ns(ns);
> +#else
> +     (void)ns;
> +     return 0;
> +#endif
> +}
> +
>  static struct ibv_cq_ex *
>  mlx5_glue_dv_create_cq(struct ibv_context *context,
>                      struct ibv_cq_init_attr_ex *cq_attr, @@ -423,26 +474,40
> @@  #endif  }
> 
> -static struct mlx5dv_flow_matcher *
> +static void *
>  mlx5_glue_dv_create_flow_matcher(struct ibv_context *context,
> -                              struct mlx5dv_flow_matcher_attr
> *matcher_attr)
> +                              struct mlx5dv_flow_matcher_attr
> *matcher_attr,
> +                              void *tbl)
>  {
>  #ifdef HAVE_IBV_FLOW_DV_SUPPORT
> +#ifdef HAVE_MLX5DV_DR
> +     (void)context;
> +     return mlx5dv_dr_create_matcher(tbl, matcher_attr->priority,
> +                                    matcher_attr->match_criteria_enable,
> +                                    matcher_attr->match_mask);
> +#else
> +     (void)tbl;
>       return mlx5dv_create_flow_matcher(context, matcher_attr);
> +#endif
>  #else
>       (void)context;
>       (void)matcher_attr;
> +     (void)tbl;
>       return NULL;
>  #endif
>  }
> 
> -static struct ibv_flow *
> -mlx5_glue_dv_create_flow(struct mlx5dv_flow_matcher *matcher,
> -                      struct mlx5dv_flow_match_parameters
> *match_value,
> +static void *
> +mlx5_glue_dv_create_flow(void *matcher,
> +                      void *match_value,
>                        size_t num_actions,
>                        void *actions[])
>  {
>  #ifdef HAVE_IBV_FLOW_DV_SUPPORT
> +#ifdef HAVE_MLX5DV_DR
> +     return mlx5dv_dr_create_rule(matcher, match_value, num_actions,
> +                                  (struct mlx5dv_dr_action **)actions); #else
>       struct mlx5dv_flow_action_attr actions_attr[8];
> 
>       if (num_actions > 8)
> @@ -452,6 +517,7 @@
>                       *((struct mlx5dv_flow_action_attr *)(actions[i]));
>       return mlx5dv_create_flow(matcher, match_value,
>                                 num_actions, actions_attr);
> +#endif
>  #else
>       (void)matcher;
>       (void)match_value;
> @@ -461,21 +527,13 @@
>  #endif
>  }
> 
> -static int
> -mlx5_glue_dv_destroy_flow_matcher(struct mlx5dv_flow_matcher
> *matcher) -{ -#ifdef HAVE_IBV_FLOW_DV_SUPPORT
> -     return mlx5dv_destroy_flow_matcher(matcher);
> -#else
> -     (void)matcher;
> -     return 0;
> -#endif
> -}
> -
>  static void *
>  mlx5_glue_dv_create_flow_action_counter(void *counter_obj, uint32_t
> offset)  {  #ifdef HAVE_IBV_FLOW_DV_SUPPORT
> +#ifdef HAVE_MLX5DV_DR
> +     return mlx5dv_dr_create_action_devx_counter(counter_obj, offset);
> +#else
>       struct mlx5dv_flow_action_attr *action;
> 
>       (void)offset;
> @@ -485,6 +543,7 @@
>       action->type = MLX5DV_FLOW_ACTION_COUNTER_DEVX;
>       action->obj = counter_obj;
>       return action;
> +#endif
>  #else
>       (void)counter_obj;
>       (void)offset;
> @@ -496,6 +555,9 @@
>  mlx5_glue_dv_create_flow_action_dest_ibv_qp(void *qp)  {  #ifdef
> HAVE_IBV_FLOW_DV_SUPPORT
> +#ifdef HAVE_MLX5DV_DR
> +     return mlx5dv_dr_create_action_dest_ibv_qp(qp);
> +#else
>       struct mlx5dv_flow_action_attr *action;
> 
>       action = malloc(sizeof(*action));
> @@ -504,6 +566,7 @@
>       action->type = MLX5DV_FLOW_ACTION_DEST_IBV_QP;
>       action->obj = qp;
>       return action;
> +#endif
>  #else
>       (void)qp;
>       return NULL;
> @@ -513,13 +576,22 @@
>  static void *
>  mlx5_glue_dv_create_flow_action_modify_header
>                                       (struct ibv_context *ctx,
> +                                      enum mlx5dv_flow_table_type
> ft_type,
> +                                      void *ns, uint64_t flags,
>                                        size_t actions_sz,
> -                                      uint64_t actions[],
> -                                      enum mlx5dv_flow_table_type
> ft_type)
> +                                      uint64_t actions[])
>  {
>  #ifdef HAVE_IBV_FLOW_DV_SUPPORT
> +#ifdef HAVE_MLX5DV_DR
> +     (void)ctx;
> +     (void)ft_type;
> +     return mlx5dv_dr_create_action_modify_header(ns, flags,
> actions_sz,
> +                                                 actions);
> +#else
>       struct mlx5dv_flow_action_attr *action;
> 
> +     (void)ns;
> +     (void)flags;
>       action = malloc(sizeof(*action));
>       if (!action)
>               return NULL;
> @@ -527,11 +599,14 @@
>       action->action = mlx5dv_create_flow_action_modify_header
>               (ctx, actions_sz, actions, ft_type);
>       return action;
> +#endif
>  #else
>       (void)ctx;
> +     (void)ft_type;
> +     (void)ns;
> +     (void)flags;
>       (void)actions_sz;
>       (void)actions;
> -     (void)ft_type;
>       return NULL;
>  #endif
>  }
> @@ -539,12 +614,20 @@
>  static void *
>  mlx5_glue_dv_create_flow_action_packet_reformat
>               (struct ibv_context *ctx,
> -              size_t data_sz,
> -              void *data,
>                enum mlx5dv_flow_action_packet_reformat_type
> reformat_type,
> -              enum mlx5dv_flow_table_type ft_type)
> +              enum mlx5dv_flow_table_type ft_type, struct mlx5dv_dr_ns
> *ns,
> +              uint32_t flags, size_t data_sz, void *data)
>  {
>  #ifdef HAVE_IBV_FLOW_DV_SUPPORT
> +#ifdef HAVE_MLX5DV_DR
> +     (void)ctx;
> +     (void)ft_type;
> +     return mlx5dv_dr_create_action_packet_reformat(ns, flags,
> +                                                    reformat_type, data_sz,
> +                                                    data);
> +#else
> +     (void)ns;
> +     (void)flags;
>       struct mlx5dv_flow_action_attr *action;
> 
>       action = malloc(sizeof(*action));
> @@ -554,12 +637,15 @@
>       action->action = mlx5dv_create_flow_action_packet_reformat
>               (ctx, data_sz, data, reformat_type, ft_type);
>       return action;
> +#endif
>  #else
>       (void)ctx;
> -     (void)data_sz;
> -     (void)data;
>       (void)reformat_type;
>       (void)ft_type;
> +     (void)ns;
> +     (void)flags;
> +     (void)data_sz;
> +     (void)data;
>       return NULL;
>  #endif
>  }
> @@ -568,6 +654,9 @@
>  mlx5_glue_dv_create_flow_action_tag(uint32_t tag)  {  #ifdef
> HAVE_IBV_FLOW_DV_SUPPORT
> +#ifdef HAVE_MLX5DV_DR
> +     return mlx5dv_dr_create_action_tag(tag); #else
>       struct mlx5dv_flow_action_attr *action;
>       action = malloc(sizeof(*action));
>       if (!action)
> @@ -576,10 +665,36 @@
>       action->tag_value = tag;
>       return action;
>  #endif
> +#endif
>       (void)tag;
>       return NULL;
>  }
> 
> +static int
> +mlx5_glue_dv_destroy_flow(void *flow_id) { #ifdef HAVE_MLX5DV_DR
> +     return mlx5dv_dr_destroy_rule(flow_id); #else
> +     return ibv_destroy_flow(flow_id);
> +#endif
> +}
> +
> +static int
> +mlx5_glue_dv_destroy_flow_matcher(void *matcher) { #ifdef
> +HAVE_IBV_FLOW_DV_SUPPORT #ifdef HAVE_MLX5DV_DR
> +     return mlx5dv_dr_destroy_matcher(matcher);
> +#else
> +     return mlx5dv_destroy_flow_matcher(matcher);
> +#endif
> +#else
> +     (void)matcher;
> +     return 0;
> +#endif
> +}
> +
>  static struct ibv_context *
>  mlx5_glue_dv_open_device(struct ibv_device *device)  { @@ -718,6 +833,10
> @@
>       .get_async_event = mlx5_glue_get_async_event,
>       .port_state_str = mlx5_glue_port_state_str,
>       .cq_ex_to_cq = mlx5_glue_cq_ex_to_cq,
> +     .dr_create_flow_tbl = mlx5_glue_dr_create_flow_tbl,
> +     .dr_destroy_flow_tbl = mlx5_glue_dr_destroy_flow_tbl,
> +     .dr_create_ns = mlx5_glue_dr_create_ns,
> +     .dr_destroy_ns = mlx5_glue_dr_destroy_ns,
>       .dv_create_cq = mlx5_glue_dv_create_cq,
>       .dv_create_wq = mlx5_glue_dv_create_wq,
>       .dv_query_device = mlx5_glue_dv_query_device, @@ -725,7 +844,6
> @@
>       .dv_init_obj = mlx5_glue_dv_init_obj,
>       .dv_create_qp = mlx5_glue_dv_create_qp,
>       .dv_create_flow_matcher = mlx5_glue_dv_create_flow_matcher,
> -     .dv_destroy_flow_matcher = mlx5_glue_dv_destroy_flow_matcher,
>       .dv_create_flow = mlx5_glue_dv_create_flow,
>       .dv_create_flow_action_counter =
>               mlx5_glue_dv_create_flow_action_counter,
> @@ -736,6 +854,8 @@
>       .dv_create_flow_action_packet_reformat =
>               mlx5_glue_dv_create_flow_action_packet_reformat,
>       .dv_create_flow_action_tag =
> mlx5_glue_dv_create_flow_action_tag,
> +     .dv_destroy_flow = mlx5_glue_dv_destroy_flow,
> +     .dv_destroy_flow_matcher = mlx5_glue_dv_destroy_flow_matcher,
>       .dv_open_device = mlx5_glue_dv_open_device,
>       .devx_obj_create = mlx5_glue_devx_obj_create,
>       .devx_obj_destroy = mlx5_glue_devx_obj_destroy, diff --git
> a/drivers/net/mlx5/mlx5_glue.h b/drivers/net/mlx5/mlx5_glue.h index
> 167f1f7..7115575 100644
> --- a/drivers/net/mlx5/mlx5_glue.h
> +++ b/drivers/net/mlx5/mlx5_glue.h
> @@ -63,6 +63,11 @@
>  struct mlx5dv_devx_obj;
>  #endif
> 
> +#ifndef HAVE_MLX5DV_DR
> +struct mlx5dv_dr_ns;
> +enum  mlx5dv_dr_ns_domain { unused, };
> +#endif
> +
>  /* LIB_GLUE_VERSION must be updated every time this structure is
> modified. */  struct mlx5_glue {
>       const char *version;
> @@ -140,6 +145,11 @@ struct mlx5_glue {
>                              struct ibv_async_event *event);
>       const char *(*port_state_str)(enum ibv_port_state port_state);
>       struct ibv_cq *(*cq_ex_to_cq)(struct ibv_cq_ex *cq);
> +     void *(*dr_create_flow_tbl)(void *ns, uint32_t level);
> +     int (*dr_destroy_flow_tbl)(void *tbl);
> +     void *(*dr_create_ns)(struct ibv_context *ctx,
> +                           enum mlx5dv_dr_ns_domain domain);
> +     int (*dr_destroy_ns)(void *ns);
>       struct ibv_cq_ex *(*dv_create_cq)
>               (struct ibv_context *context,
>                struct ibv_cq_init_attr_ex *cq_attr, @@ -158,23 +168,26
> @@ struct mlx5_glue {
>               (struct ibv_context *context,
>                struct ibv_qp_init_attr_ex *qp_init_attr_ex,
>                struct mlx5dv_qp_init_attr *dv_qp_init_attr);
> -     struct mlx5dv_flow_matcher *(*dv_create_flow_matcher)
> +     void *(*dv_create_flow_matcher)
>               (struct ibv_context *context,
> -              struct mlx5dv_flow_matcher_attr *matcher_attr);
> -     int (*dv_destroy_flow_matcher)(struct mlx5dv_flow_matcher
> *matcher);
> -     struct ibv_flow *(*dv_create_flow)(struct mlx5dv_flow_matcher
> *matcher,
> -                       struct mlx5dv_flow_match_parameters
> *match_value,
> +              struct mlx5dv_flow_matcher_attr *matcher_attr,
> +              void *tbl);
> +     void *(*dv_create_flow)(void *matcher, void *match_value,
>                         size_t num_actions, void *actions[]);
>       void *(*dv_create_flow_action_counter)(void *obj, uint32_t  offset);
>       void *(*dv_create_flow_action_dest_ibv_qp)(void *qp);
>       void *(*dv_create_flow_action_modify_header)
> -             (struct ibv_context *ctx, size_t actions_sz, uint64_t actions[],
> -              enum mlx5dv_flow_table_type ft_type);
> +             (struct ibv_context *ctx, enum mlx5dv_flow_table_type
> ft_type,
> +              void *ns, uint64_t flags, size_t actions_sz,
> +              uint64_t actions[]);
>       void *(*dv_create_flow_action_packet_reformat)
> -             (struct ibv_context *ctx, size_t data_sz, void *data,
> +             (struct ibv_context *ctx,
>                enum mlx5dv_flow_action_packet_reformat_type
> reformat_type,
> -              enum mlx5dv_flow_table_type ft_type);
> +              enum mlx5dv_flow_table_type ft_type, struct mlx5dv_dr_ns
> *ns,
> +              uint32_t flags, size_t data_sz, void *data);
>       void *(*dv_create_flow_action_tag)(uint32_t tag);
> +     int (*dv_destroy_flow)(void *flow);
> +     int (*dv_destroy_flow_matcher)(void *matcher);
>       struct ibv_context *(*dv_open_device)(struct ibv_device *device);
>       struct mlx5dv_devx_obj *(*devx_obj_create)
>                                       (struct ibv_context *ctx,
> diff --git a/drivers/net/mlx5/mlx5_prm.h b/drivers/net/mlx5/mlx5_prm.h
> index da1219e..b15266f 100644
> --- a/drivers/net/mlx5/mlx5_prm.h
> +++ b/drivers/net/mlx5/mlx5_prm.h
> @@ -492,20 +492,40 @@ struct mlx5_ifc_fte_match_set_misc2_bits {
>       u8 reserved_at_1a0[0x60];
>  };
> 
> +struct mlx5_ifc_fte_match_set_misc3_bits {
> +     u8 inner_tcp_seq_num[0x20];
> +     u8 outer_tcp_seq_num[0x20];
> +     u8 inner_tcp_ack_num[0x20];
> +     u8 outer_tcp_ack_num[0x20];
> +     u8 reserved_at_auto1[0x8];
> +     u8 outer_vxlan_gpe_vni[0x18];
> +     u8 outer_vxlan_gpe_next_protocol[0x8];
> +     u8 outer_vxlan_gpe_flags[0x8];
> +     u8 reserved_at_a8[0x10];
> +     u8 icmp_header_data[0x20];
> +     u8 icmpv6_header_data[0x20];
> +     u8 icmp_type[0x8];
> +     u8 icmp_code[0x8];
> +     u8 icmpv6_type[0x8];
> +     u8 icmpv6_code[0x8];
> +     u8 reserved_at_1a0[0xe0];
> +};
> +
>  /* Flow matcher. */
>  struct mlx5_ifc_fte_match_param_bits {
>       struct mlx5_ifc_fte_match_set_lyr_2_4_bits outer_headers;
>       struct mlx5_ifc_fte_match_set_misc_bits misc_parameters;
>       struct mlx5_ifc_fte_match_set_lyr_2_4_bits inner_headers;
>       struct mlx5_ifc_fte_match_set_misc2_bits misc_parameters_2;
> -     u8 reserved_at_800[0x800];
> +     struct mlx5_ifc_fte_match_set_misc3_bits misc_parameters_3;
>  };
> 
>  enum {
>       MLX5_MATCH_CRITERIA_ENABLE_OUTER_BIT,
>       MLX5_MATCH_CRITERIA_ENABLE_MISC_BIT,
>       MLX5_MATCH_CRITERIA_ENABLE_INNER_BIT,
> -     MLX5_MATCH_CRITERIA_ENABLE_MISC2_BIT
> +     MLX5_MATCH_CRITERIA_ENABLE_MISC2_BIT,
> +     MLX5_MATCH_CRITERIA_ENABLE_MISC3_BIT
>  };
> 
>  enum {
> --
> 1.8.3.1

Reply via email to