Re: [dpdk-dev] [PATCH v3 11/14] net/mlx5: support MPLS-in-GRE and MPLS-in-UDP

2018-04-16 Thread Nélio Laranjeiro
On Fri, Apr 13, 2018 at 03:22:50PM +, Xueming(Steven) Li wrote:
>[...] 
> > @@
> > > > static
> > > > > const struct mlx5_flow_items mlx5_flow_items[] = {
> > > > >   .convert = mlx5_flow_create_vxlan_gpe,
> > > > >   .dst_sz = sizeof(struct ibv_flow_spec_tunnel),
> > > > >   },
> > > > > + [RTE_FLOW_ITEM_TYPE_MPLS] = {
> > > > > + .items = ITEMS(RTE_FLOW_ITEM_TYPE_ETH,
> > > > > +RTE_FLOW_ITEM_TYPE_IPV4,
> > > > > +RTE_FLOW_ITEM_TYPE_IPV6),
> > > > > + .actions = valid_actions,
> > > > > + .mask = &(const struct rte_flow_item_mpls){
> > > > > + .label_tc_s = "\xff\xff\xf0",
> > > > > + },
> > > > > + .default_mask = &rte_flow_item_mpls_mask,
> > > > > + .mask_sz = sizeof(struct rte_flow_item_mpls),
> > > > > + .convert = mlx5_flow_create_mpls, #ifdef
> > > > > +HAVE_IBV_DEVICE_MPLS_SUPPORT
> > > > > + .dst_sz = sizeof(struct ibv_flow_spec_mpls), #endif
> > > > > + },
> > > >
> > > > Why the whole item is not under ifdef?
> > >
> > > If apply macro to whole item, there will be a null pointer if create
> > mpls flow.
> > > There is a macro in function mlx5_flow_create_mpls() to avoid using this
> > invalid data.
> > 
> > I think there is some kind of confusion here, what I mean is moving the
> > #ifdef to embrace the whole stuff i.e.:
> > 
> >  #ifdef HAVE_IBV_DEVICE_MPLS_SUPPORT
> >  [RTE_FLOW_ITEM_TYPE_MPLS] = {
> >   .items = ITEMS(RTE_FLOW_ITEM_TYPE_ETH,
> >RTE_FLOW_ITEM_TYPE_IPV4,
> >RTE_FLOW_ITEM_TYPE_IPV6),
> >   .actions = valid_actions,
> >   .mask = &(const struct rte_flow_item_mpls){
> > .label_tc_s = "\xff\xff\xf0",
> >   },
> >   .default_mask = &rte_flow_item_mpls_mask,
> >   .mask_sz = sizeof(struct rte_flow_item_mpls),
> >   .convert = mlx5_flow_create_mpls,
> >   .dst_sz = sizeof(struct ibv_flow_spec_mpls)  #endif
> > 
> > Not having this item in this static array ends by not supporting it, this
> > is what I mean.
> 
> Yes, I know. There is a code using this array w/o NULL check:
>   cur_item = &mlx5_flow_items[items->type];
>   ret = cur_item->convert(items,
>   (cur_item->default_mask ?
>cur_item->default_mask :
>cur_item->mask),
>&data);
> 
> 

This code is after the mlx5_flow_convert_items_validate() which refuses
unknown items, if you you see an unknown item reaching this code above,
there is bug somewhere and it should be fixed.  Un-supported items
should not be in the static array.  

Regards,

-- 
Nélio Laranjeiro
6WIND


Re: [dpdk-dev] [PATCH v3 11/14] net/mlx5: support MPLS-in-GRE and MPLS-in-UDP

2018-04-13 Thread Xueming(Steven) Li


> -Original Message-
> From: Nélio Laranjeiro 
> Sent: Friday, April 13, 2018 10:56 PM
> To: Xueming(Steven) Li 
> Cc: Shahaf Shuler ; dev@dpdk.org
> Subject: Re: [PATCH v3 11/14] net/mlx5: support MPLS-in-GRE and MPLS-in-
> UDP
> 
> On Fri, Apr 13, 2018 at 02:48:17PM +, Xueming(Steven) Li wrote:
> >
> >
> > > -Original Message-
> > > From: Nélio Laranjeiro 
> > > Sent: Friday, April 13, 2018 9:37 PM
> > > To: Xueming(Steven) Li 
> > > Cc: Shahaf Shuler ; dev@dpdk.org
> > > Subject: Re: [PATCH v3 11/14] net/mlx5: support MPLS-in-GRE and
> > > MPLS-in- UDP
> > >
> > > Some nits,
> > >
> > > On Fri, Apr 13, 2018 at 07:20:20PM +0800, Xueming Li wrote:
> > > > This patch supports new tunnel type MPLS-in-GRE and MPLS-in-UDP.
> > > > Flow pattern example:
> > > >   ipv4 proto is 47 / gre proto is 0x8847 / mpls
> > > >   ipv4 / udp dst is 6635 / mpls / end
> > > >
> > > > Signed-off-by: Xueming Li 
> > > > ---
> > > >  drivers/net/mlx5/Makefile|   5 ++
> > > >  drivers/net/mlx5/mlx5.c  |  15 +
> > > >  drivers/net/mlx5/mlx5.h  |   1 +
> > > >  drivers/net/mlx5/mlx5_flow.c | 148
> > > > ++-
> > > >  4 files changed, 166 insertions(+), 3 deletions(-)
> > > >
> > > > diff --git a/drivers/net/mlx5/Makefile b/drivers/net/mlx5/Makefile
> > > > index f9a6c460b..33553483e 100644
> > > > --- a/drivers/net/mlx5/Makefile
> > > > +++ b/drivers/net/mlx5/Makefile
> > > > @@ -131,6 +131,11 @@ mlx5_autoconf.h.new:
> > > > $(RTE_SDK)/buildtools/auto-
> > > config-h.sh
> > > > enum MLX5DV_CONTEXT_MASK_TUNNEL_OFFLOADS \
> > > > $(AUTOCONF_OUTPUT)
> > > > $Q sh -- '$<' '$@' \
> > > > +   HAVE_IBV_DEVICE_MPLS_SUPPORT \
> > > > +   infiniband/verbs.h \
> > > > +   enum IBV_FLOW_SPEC_MPLS \
> > > > +   $(AUTOCONF_OUTPUT)
> > > > +   $Q sh -- '$<' '$@' \
> > > > HAVE_IBV_WQ_FLAG_RX_END_PADDING \
> > > > infiniband/verbs.h \
> > > > enum IBV_WQ_FLAG_RX_END_PADDING \ diff --git
> > > > a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c index
> > > > 38118e524..89b683d6e 100644
> > > > --- a/drivers/net/mlx5/mlx5.c
> > > > +++ b/drivers/net/mlx5/mlx5.c
> > > > @@ -614,6 +614,7 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv
> > > __rte_unused,
> > > > unsigned int cqe_comp;
> > > > unsigned int tunnel_en = 0;
> > > > unsigned int verb_priorities = 0;
> > > > +   unsigned int mpls_en = 0;
> > > > int idx;
> > > > int i;
> > > > struct mlx5dv_context attrs_out = {0}; @@ -720,12 +721,25 @@
> > > > mlx5_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
> > > >   
> > > > MLX5DV_RAW_PACKET_CAP_TUNNELED_OFFLOAD_VXLAN)
> &&
> > > >  (attrs_out.tunnel_offloads_caps &
> > > >   
> > > > MLX5DV_RAW_PACKET_CAP_TUNNELED_OFFLOAD_GRE));
> > > > +#ifdef HAVE_IBV_DEVICE_MPLS_SUPPORT
> > > > +   mpls_en = ((attrs_out.tunnel_offloads_caps &
> > > > +
> MLX5DV_RAW_PACKET_CAP_TUNNELED_OFFLOAD_MPLS_GRE) &&
> > > > +  (attrs_out.tunnel_offloads_caps &
> > > > +
> MLX5DV_RAW_PACKET_CAP_TUNNELED_OFFLOAD_MPLS_UDP) &&
> > > > +  (attrs_out.tunnel_offloads_caps &
> > > > +
> MLX5DV_RAW_PACKET_CAP_TUNNELED_OFFLOAD_CTRL_DW_MPLS));
> > > > +#endif
> > > > }
> > > > DRV_LOG(DEBUG, "tunnel offloading is %ssupported",
> > > > tunnel_en ? "" : "not ");
> > > > +   DRV_LOG(DEBUG, "MPLS over GRE/UDP offloading is %ssupported",
> > > > +   mpls_en ? "" : "not ");
> > > >  #else
> > > > DRV_LOG(WARNING,
> > > > "tunnel offloading disabled due to old OFED/rdma-core
> > > version");
> > > > +   DRV_LOG(WARNING,
> > > > +   "MPLS over GRE/UDP offloading disabled due to old"
> > > > +   " OFED/rdma-core version or firmware configuration");
> > > >  #endif
> > > > if (mlx5_glue->query_device_ex(attr_ctx, NULL, &device_attr))
> {
> > > > err = errno;
> > > > @@ -749,6 +763,7 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv
> > > __rte_unused,
> > > > .cqe_comp = cqe_comp,
> > > > .mps = mps,
> > > > .tunnel_en = tunnel_en,
> > > > +   .mpls_en = mpls_en,
> > > > .tx_vec_en = 1,
> > > > .rx_vec_en = 1,
> > > > .mpw_hdr_dseg = 0,
> > > > diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
> > > > index
> > > > 6e4613fe0..efbcb2156 100644
> > > > --- a/drivers/net/mlx5/mlx5.h
> > > > +++ b/drivers/net/mlx5/mlx5.h
> > > > @@ -81,6 +81,7 @@ struct mlx5_dev_config {
> > > > unsigned int vf:1; /* This is a VF. */
> > > > unsigned int mps:2; /* Multi-packet send suppor

Re: [dpdk-dev] [PATCH v3 11/14] net/mlx5: support MPLS-in-GRE and MPLS-in-UDP

2018-04-13 Thread Nélio Laranjeiro
On Fri, Apr 13, 2018 at 02:48:17PM +, Xueming(Steven) Li wrote:
> 
> 
> > -Original Message-
> > From: Nélio Laranjeiro 
> > Sent: Friday, April 13, 2018 9:37 PM
> > To: Xueming(Steven) Li 
> > Cc: Shahaf Shuler ; dev@dpdk.org
> > Subject: Re: [PATCH v3 11/14] net/mlx5: support MPLS-in-GRE and MPLS-in-
> > UDP
> > 
> > Some nits,
> > 
> > On Fri, Apr 13, 2018 at 07:20:20PM +0800, Xueming Li wrote:
> > > This patch supports new tunnel type MPLS-in-GRE and MPLS-in-UDP.
> > > Flow pattern example:
> > >   ipv4 proto is 47 / gre proto is 0x8847 / mpls
> > >   ipv4 / udp dst is 6635 / mpls / end
> > >
> > > Signed-off-by: Xueming Li 
> > > ---
> > >  drivers/net/mlx5/Makefile|   5 ++
> > >  drivers/net/mlx5/mlx5.c  |  15 +
> > >  drivers/net/mlx5/mlx5.h  |   1 +
> > >  drivers/net/mlx5/mlx5_flow.c | 148
> > > ++-
> > >  4 files changed, 166 insertions(+), 3 deletions(-)
> > >
> > > diff --git a/drivers/net/mlx5/Makefile b/drivers/net/mlx5/Makefile
> > > index f9a6c460b..33553483e 100644
> > > --- a/drivers/net/mlx5/Makefile
> > > +++ b/drivers/net/mlx5/Makefile
> > > @@ -131,6 +131,11 @@ mlx5_autoconf.h.new: $(RTE_SDK)/buildtools/auto-
> > config-h.sh
> > >   enum MLX5DV_CONTEXT_MASK_TUNNEL_OFFLOADS \
> > >   $(AUTOCONF_OUTPUT)
> > >   $Q sh -- '$<' '$@' \
> > > + HAVE_IBV_DEVICE_MPLS_SUPPORT \
> > > + infiniband/verbs.h \
> > > + enum IBV_FLOW_SPEC_MPLS \
> > > + $(AUTOCONF_OUTPUT)
> > > + $Q sh -- '$<' '$@' \
> > >   HAVE_IBV_WQ_FLAG_RX_END_PADDING \
> > >   infiniband/verbs.h \
> > >   enum IBV_WQ_FLAG_RX_END_PADDING \
> > > diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c index
> > > 38118e524..89b683d6e 100644
> > > --- a/drivers/net/mlx5/mlx5.c
> > > +++ b/drivers/net/mlx5/mlx5.c
> > > @@ -614,6 +614,7 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv
> > __rte_unused,
> > >   unsigned int cqe_comp;
> > >   unsigned int tunnel_en = 0;
> > >   unsigned int verb_priorities = 0;
> > > + unsigned int mpls_en = 0;
> > >   int idx;
> > >   int i;
> > >   struct mlx5dv_context attrs_out = {0}; @@ -720,12 +721,25 @@
> > > mlx5_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
> > > MLX5DV_RAW_PACKET_CAP_TUNNELED_OFFLOAD_VXLAN) &&
> > >(attrs_out.tunnel_offloads_caps &
> > > MLX5DV_RAW_PACKET_CAP_TUNNELED_OFFLOAD_GRE));
> > > +#ifdef HAVE_IBV_DEVICE_MPLS_SUPPORT
> > > + mpls_en = ((attrs_out.tunnel_offloads_caps &
> > > + MLX5DV_RAW_PACKET_CAP_TUNNELED_OFFLOAD_MPLS_GRE) &&
> > > +(attrs_out.tunnel_offloads_caps &
> > > + MLX5DV_RAW_PACKET_CAP_TUNNELED_OFFLOAD_MPLS_UDP) &&
> > > +(attrs_out.tunnel_offloads_caps &
> > > +   MLX5DV_RAW_PACKET_CAP_TUNNELED_OFFLOAD_CTRL_DW_MPLS));
> > > +#endif
> > >   }
> > >   DRV_LOG(DEBUG, "tunnel offloading is %ssupported",
> > >   tunnel_en ? "" : "not ");
> > > + DRV_LOG(DEBUG, "MPLS over GRE/UDP offloading is %ssupported",
> > > + mpls_en ? "" : "not ");
> > >  #else
> > >   DRV_LOG(WARNING,
> > >   "tunnel offloading disabled due to old OFED/rdma-core
> > version");
> > > + DRV_LOG(WARNING,
> > > + "MPLS over GRE/UDP offloading disabled due to old"
> > > + " OFED/rdma-core version or firmware configuration");
> > >  #endif
> > >   if (mlx5_glue->query_device_ex(attr_ctx, NULL, &device_attr)) {
> > >   err = errno;
> > > @@ -749,6 +763,7 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv
> > __rte_unused,
> > >   .cqe_comp = cqe_comp,
> > >   .mps = mps,
> > >   .tunnel_en = tunnel_en,
> > > + .mpls_en = mpls_en,
> > >   .tx_vec_en = 1,
> > >   .rx_vec_en = 1,
> > >   .mpw_hdr_dseg = 0,
> > > diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index
> > > 6e4613fe0..efbcb2156 100644
> > > --- a/drivers/net/mlx5/mlx5.h
> > > +++ b/drivers/net/mlx5/mlx5.h
> > > @@ -81,6 +81,7 @@ struct mlx5_dev_config {
> > >   unsigned int vf:1; /* This is a VF. */
> > >   unsigned int mps:2; /* Multi-packet send supported mode. */
> > >   unsigned int tunnel_en:1;
> > > + unsigned int mpls_en:1; /* MPLS over GRE/UDP is enabled. */
> > >   /* Whether tunnel stateless offloads are supported. */
> > >   unsigned int flow_counter_en:1; /* Whether flow counter is supported.
> > */
> > >   unsigned int cqe_comp:1; /* CQE compression is enabled. */ diff
> > > --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c
> > > index 0fccd39b3..98edf1882 100644
> > > --- a/drivers/net/mlx5/mlx5_flow.c
> > > +++ b/drivers/net/mlx5/mlx5_flow.c
> > > @@ -100,6 +100,11 @@ mlx5_flow_create_gre(const struct rte_flow_item
> > *item,
> > >  const void *default_mask,
> > >  struct 

Re: [dpdk-dev] [PATCH v3 11/14] net/mlx5: support MPLS-in-GRE and MPLS-in-UDP

2018-04-13 Thread Xueming(Steven) Li


> -Original Message-
> From: Nélio Laranjeiro 
> Sent: Friday, April 13, 2018 9:37 PM
> To: Xueming(Steven) Li 
> Cc: Shahaf Shuler ; dev@dpdk.org
> Subject: Re: [PATCH v3 11/14] net/mlx5: support MPLS-in-GRE and MPLS-in-
> UDP
> 
> Some nits,
> 
> On Fri, Apr 13, 2018 at 07:20:20PM +0800, Xueming Li wrote:
> > This patch supports new tunnel type MPLS-in-GRE and MPLS-in-UDP.
> > Flow pattern example:
> >   ipv4 proto is 47 / gre proto is 0x8847 / mpls
> >   ipv4 / udp dst is 6635 / mpls / end
> >
> > Signed-off-by: Xueming Li 
> > ---
> >  drivers/net/mlx5/Makefile|   5 ++
> >  drivers/net/mlx5/mlx5.c  |  15 +
> >  drivers/net/mlx5/mlx5.h  |   1 +
> >  drivers/net/mlx5/mlx5_flow.c | 148
> > ++-
> >  4 files changed, 166 insertions(+), 3 deletions(-)
> >
> > diff --git a/drivers/net/mlx5/Makefile b/drivers/net/mlx5/Makefile
> > index f9a6c460b..33553483e 100644
> > --- a/drivers/net/mlx5/Makefile
> > +++ b/drivers/net/mlx5/Makefile
> > @@ -131,6 +131,11 @@ mlx5_autoconf.h.new: $(RTE_SDK)/buildtools/auto-
> config-h.sh
> > enum MLX5DV_CONTEXT_MASK_TUNNEL_OFFLOADS \
> > $(AUTOCONF_OUTPUT)
> > $Q sh -- '$<' '$@' \
> > +   HAVE_IBV_DEVICE_MPLS_SUPPORT \
> > +   infiniband/verbs.h \
> > +   enum IBV_FLOW_SPEC_MPLS \
> > +   $(AUTOCONF_OUTPUT)
> > +   $Q sh -- '$<' '$@' \
> > HAVE_IBV_WQ_FLAG_RX_END_PADDING \
> > infiniband/verbs.h \
> > enum IBV_WQ_FLAG_RX_END_PADDING \
> > diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c index
> > 38118e524..89b683d6e 100644
> > --- a/drivers/net/mlx5/mlx5.c
> > +++ b/drivers/net/mlx5/mlx5.c
> > @@ -614,6 +614,7 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv
> __rte_unused,
> > unsigned int cqe_comp;
> > unsigned int tunnel_en = 0;
> > unsigned int verb_priorities = 0;
> > +   unsigned int mpls_en = 0;
> > int idx;
> > int i;
> > struct mlx5dv_context attrs_out = {0}; @@ -720,12 +721,25 @@
> > mlx5_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
> >   MLX5DV_RAW_PACKET_CAP_TUNNELED_OFFLOAD_VXLAN) &&
> >  (attrs_out.tunnel_offloads_caps &
> >   MLX5DV_RAW_PACKET_CAP_TUNNELED_OFFLOAD_GRE));
> > +#ifdef HAVE_IBV_DEVICE_MPLS_SUPPORT
> > +   mpls_en = ((attrs_out.tunnel_offloads_caps &
> > +   MLX5DV_RAW_PACKET_CAP_TUNNELED_OFFLOAD_MPLS_GRE) &&
> > +  (attrs_out.tunnel_offloads_caps &
> > +   MLX5DV_RAW_PACKET_CAP_TUNNELED_OFFLOAD_MPLS_UDP) &&
> > +  (attrs_out.tunnel_offloads_caps &
> > + MLX5DV_RAW_PACKET_CAP_TUNNELED_OFFLOAD_CTRL_DW_MPLS));
> > +#endif
> > }
> > DRV_LOG(DEBUG, "tunnel offloading is %ssupported",
> > tunnel_en ? "" : "not ");
> > +   DRV_LOG(DEBUG, "MPLS over GRE/UDP offloading is %ssupported",
> > +   mpls_en ? "" : "not ");
> >  #else
> > DRV_LOG(WARNING,
> > "tunnel offloading disabled due to old OFED/rdma-core
> version");
> > +   DRV_LOG(WARNING,
> > +   "MPLS over GRE/UDP offloading disabled due to old"
> > +   " OFED/rdma-core version or firmware configuration");
> >  #endif
> > if (mlx5_glue->query_device_ex(attr_ctx, NULL, &device_attr)) {
> > err = errno;
> > @@ -749,6 +763,7 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv
> __rte_unused,
> > .cqe_comp = cqe_comp,
> > .mps = mps,
> > .tunnel_en = tunnel_en,
> > +   .mpls_en = mpls_en,
> > .tx_vec_en = 1,
> > .rx_vec_en = 1,
> > .mpw_hdr_dseg = 0,
> > diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index
> > 6e4613fe0..efbcb2156 100644
> > --- a/drivers/net/mlx5/mlx5.h
> > +++ b/drivers/net/mlx5/mlx5.h
> > @@ -81,6 +81,7 @@ struct mlx5_dev_config {
> > unsigned int vf:1; /* This is a VF. */
> > unsigned int mps:2; /* Multi-packet send supported mode. */
> > unsigned int tunnel_en:1;
> > +   unsigned int mpls_en:1; /* MPLS over GRE/UDP is enabled. */
> > /* Whether tunnel stateless offloads are supported. */
> > unsigned int flow_counter_en:1; /* Whether flow counter is supported.
> */
> > unsigned int cqe_comp:1; /* CQE compression is enabled. */ diff
> > --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c
> > index 0fccd39b3..98edf1882 100644
> > --- a/drivers/net/mlx5/mlx5_flow.c
> > +++ b/drivers/net/mlx5/mlx5_flow.c
> > @@ -100,6 +100,11 @@ mlx5_flow_create_gre(const struct rte_flow_item
> *item,
> >const void *default_mask,
> >struct mlx5_flow_data *data);
> >
> > +static int
> > +mlx5_flow_create_mpls(const struct rte_flow_item *item,
> > + const void *default_mask,
> > + struct mlx5_

Re: [dpdk-dev] [PATCH v3 11/14] net/mlx5: support MPLS-in-GRE and MPLS-in-UDP

2018-04-13 Thread Nélio Laranjeiro
Some nits,

On Fri, Apr 13, 2018 at 07:20:20PM +0800, Xueming Li wrote:
> This patch supports new tunnel type MPLS-in-GRE and MPLS-in-UDP.
> Flow pattern example:
>   ipv4 proto is 47 / gre proto is 0x8847 / mpls
>   ipv4 / udp dst is 6635 / mpls / end
> 
> Signed-off-by: Xueming Li 
> ---
>  drivers/net/mlx5/Makefile|   5 ++
>  drivers/net/mlx5/mlx5.c  |  15 +
>  drivers/net/mlx5/mlx5.h  |   1 +
>  drivers/net/mlx5/mlx5_flow.c | 148 
> ++-
>  4 files changed, 166 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/net/mlx5/Makefile b/drivers/net/mlx5/Makefile
> index f9a6c460b..33553483e 100644
> --- a/drivers/net/mlx5/Makefile
> +++ b/drivers/net/mlx5/Makefile
> @@ -131,6 +131,11 @@ mlx5_autoconf.h.new: 
> $(RTE_SDK)/buildtools/auto-config-h.sh
>   enum MLX5DV_CONTEXT_MASK_TUNNEL_OFFLOADS \
>   $(AUTOCONF_OUTPUT)
>   $Q sh -- '$<' '$@' \
> + HAVE_IBV_DEVICE_MPLS_SUPPORT \
> + infiniband/verbs.h \
> + enum IBV_FLOW_SPEC_MPLS \
> + $(AUTOCONF_OUTPUT)
> + $Q sh -- '$<' '$@' \
>   HAVE_IBV_WQ_FLAG_RX_END_PADDING \
>   infiniband/verbs.h \
>   enum IBV_WQ_FLAG_RX_END_PADDING \
> diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c
> index 38118e524..89b683d6e 100644
> --- a/drivers/net/mlx5/mlx5.c
> +++ b/drivers/net/mlx5/mlx5.c
> @@ -614,6 +614,7 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv 
> __rte_unused,
>   unsigned int cqe_comp;
>   unsigned int tunnel_en = 0;
>   unsigned int verb_priorities = 0;
> + unsigned int mpls_en = 0;
>   int idx;
>   int i;
>   struct mlx5dv_context attrs_out = {0};
> @@ -720,12 +721,25 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv 
> __rte_unused,
> MLX5DV_RAW_PACKET_CAP_TUNNELED_OFFLOAD_VXLAN) &&
>(attrs_out.tunnel_offloads_caps &
> MLX5DV_RAW_PACKET_CAP_TUNNELED_OFFLOAD_GRE));
> +#ifdef HAVE_IBV_DEVICE_MPLS_SUPPORT
> + mpls_en = ((attrs_out.tunnel_offloads_caps &
> + MLX5DV_RAW_PACKET_CAP_TUNNELED_OFFLOAD_MPLS_GRE) &&
> +(attrs_out.tunnel_offloads_caps &
> + MLX5DV_RAW_PACKET_CAP_TUNNELED_OFFLOAD_MPLS_UDP) &&
> +(attrs_out.tunnel_offloads_caps &
> +   MLX5DV_RAW_PACKET_CAP_TUNNELED_OFFLOAD_CTRL_DW_MPLS));
> +#endif
>   }
>   DRV_LOG(DEBUG, "tunnel offloading is %ssupported",
>   tunnel_en ? "" : "not ");
> + DRV_LOG(DEBUG, "MPLS over GRE/UDP offloading is %ssupported",
> + mpls_en ? "" : "not ");
>  #else
>   DRV_LOG(WARNING,
>   "tunnel offloading disabled due to old OFED/rdma-core version");
> + DRV_LOG(WARNING,
> + "MPLS over GRE/UDP offloading disabled due to old"
> + " OFED/rdma-core version or firmware configuration");
>  #endif
>   if (mlx5_glue->query_device_ex(attr_ctx, NULL, &device_attr)) {
>   err = errno;
> @@ -749,6 +763,7 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv 
> __rte_unused,
>   .cqe_comp = cqe_comp,
>   .mps = mps,
>   .tunnel_en = tunnel_en,
> + .mpls_en = mpls_en,
>   .tx_vec_en = 1,
>   .rx_vec_en = 1,
>   .mpw_hdr_dseg = 0,
> diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
> index 6e4613fe0..efbcb2156 100644
> --- a/drivers/net/mlx5/mlx5.h
> +++ b/drivers/net/mlx5/mlx5.h
> @@ -81,6 +81,7 @@ struct mlx5_dev_config {
>   unsigned int vf:1; /* This is a VF. */
>   unsigned int mps:2; /* Multi-packet send supported mode. */
>   unsigned int tunnel_en:1;
> + unsigned int mpls_en:1; /* MPLS over GRE/UDP is enabled. */
>   /* Whether tunnel stateless offloads are supported. */
>   unsigned int flow_counter_en:1; /* Whether flow counter is supported. */
>   unsigned int cqe_comp:1; /* CQE compression is enabled. */
> diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c
> index 0fccd39b3..98edf1882 100644
> --- a/drivers/net/mlx5/mlx5_flow.c
> +++ b/drivers/net/mlx5/mlx5_flow.c
> @@ -100,6 +100,11 @@ mlx5_flow_create_gre(const struct rte_flow_item *item,
>  const void *default_mask,
>  struct mlx5_flow_data *data);
>  
> +static int
> +mlx5_flow_create_mpls(const struct rte_flow_item *item,
> +   const void *default_mask,
> +   struct mlx5_flow_data *data);
> +
>  struct mlx5_flow_parse;
>  
>  static void
> @@ -247,12 +252,14 @@ struct rte_flow {
>  #define IS_TUNNEL(type) ( \
>   (type) == RTE_FLOW_ITEM_TYPE_VXLAN || \
>   (type) == RTE_FLOW_ITEM_TYPE_VXLAN_GPE || \
> + (type) == RTE_FLOW_ITEM_TYPE_MPLS || \
>   (type) == RTE_FLOW_ITEM_TYPE_GRE)