Support VxLAN all fields support. To match GBP or GPE extension, the user needs to set the right UDP destination port plus the desired VxLAN flag bits.
Signed-off-by: Rongwei Liu <rongw...@nvidia.com> Reviewed-by: Alex Vesker <va...@nvidia.com> Acked-by: Dariusz Sosnowski <dsosnow...@nvidia.com> --- doc/guides/nics/mlx5.rst | 18 +++++++------- drivers/net/mlx5/hws/mlx5dr_definer.c | 36 ++++++--------------------- drivers/net/mlx5/hws/mlx5dr_definer.h | 4 +-- 3 files changed, 19 insertions(+), 39 deletions(-) diff --git a/doc/guides/nics/mlx5.rst b/doc/guides/nics/mlx5.rst index 9b2fe07fd3..dcc1beb812 100644 --- a/doc/guides/nics/mlx5.rst +++ b/doc/guides/nics/mlx5.rst @@ -302,21 +302,21 @@ Limitations size and ``txq_inline_min`` settings and may be from 2 (worst case forced by maximal inline settings) to 58. -- Match on VXLAN supports the following fields only: +- Match on VXLAN supports any bits in the tunnel header - - VNI - - Last reserved 8-bits - - Last reserved 8-bits matching is only supported When using DV flow - engine (``dv_flow_en`` = 1). - For ConnectX-5, the UDP destination port must be the standard one (4789). - Group zero's behavior may differ which depends on FW. - Matching value equals 0 (value & mask) is not supported. + - Flag 8-bits and first 24-bits reserved fields matching is only supported When using DV flow + engine (``dv_flow_en`` = 2). + - For ConnectX-5, the UDP destination port must be the standard one (4789). + - Group zero's behavior may differ which depends on FW. + - Default UDP destination is 4789 if not explicitly specified. + - User should set different flags when matching on VXLAN-GPE/GBP: like I and GPE bits for + GPE and G bit for GBP. - Matching on VXLAN-GPE header fields: - ``rsvd0``/``rsvd1`` matching support depends on FW version when using DV flow engine (``dv_flow_en`` = 1). + - ``protocol`` should be explicitly specified in HWS steering (``dv_flow_en`` = 2). - L3 VXLAN and VXLAN-GPE tunnels cannot be supported together with MPLSoGRE and MPLSoUDP. diff --git a/drivers/net/mlx5/hws/mlx5dr_definer.c b/drivers/net/mlx5/hws/mlx5dr_definer.c index a0f95c6923..63381c1111 100644 --- a/drivers/net/mlx5/hws/mlx5dr_definer.c +++ b/drivers/net/mlx5/hws/mlx5dr_definer.c @@ -203,7 +203,8 @@ struct mlx5dr_definer_conv_data { X(SET, gtp_next_ext_hdr, GTP_PDU_SC, rte_flow_item_gtp_psc) \ X(SET, gtp_ext_hdr_pdu, v->hdr.type, rte_flow_item_gtp_psc) \ X(SET, gtp_ext_hdr_qfi, v->hdr.qfi, rte_flow_item_gtp_psc) \ - X(SET, vxlan_flags, v->flags, rte_flow_item_vxlan) \ + X(SET_BE32, vxlan_vx_flags, v->hdr.vx_flags, rte_flow_item_vxlan) \ + X(SET_BE32, vxlan_vx_vni, v->hdr.vx_vni, rte_flow_item_vxlan) \ X(SET, vxlan_udp_port, UDP_VXLAN_PORT, rte_flow_item_vxlan) \ X(SET, vxlan_gpe_udp_port, UDP_VXLAN_GPE_PORT, rte_flow_item_vxlan_gpe) \ X(SET, vxlan_gpe_flags, v->flags, rte_flow_item_vxlan_gpe) \ @@ -600,16 +601,6 @@ mlx5dr_definer_gre_key_set(struct mlx5dr_definer_fc *fc, DR_SET_BE32(tag, *v, fc->byte_off, fc->bit_off, fc->bit_mask); } -static void -mlx5dr_definer_vxlan_vni_set(struct mlx5dr_definer_fc *fc, - const void *item_spec, - uint8_t *tag) -{ - const struct rte_flow_item_vxlan *v = item_spec; - - memcpy(tag + fc->byte_off, v->vni, sizeof(v->vni)); -} - static void mlx5dr_definer_ipv6_tos_set(struct mlx5dr_definer_fc *fc, const void *item_spec, @@ -1555,13 +1546,6 @@ mlx5dr_definer_conv_item_vxlan(struct mlx5dr_definer_conv_data *cd, struct mlx5dr_definer_fc *fc; bool inner = cd->tunnel; - if (m && (m->rsvd0[0] != 0 || m->rsvd0[1] != 0 || m->rsvd0[2] != 0 || - m->rsvd1 != 0)) { - DR_LOG(ERR, "reserved fields are not supported"); - rte_errno = ENOTSUP; - return rte_errno; - } - if (inner) { DR_LOG(ERR, "Inner VXLAN item not supported"); rte_errno = ENOTSUP; @@ -1590,22 +1574,18 @@ mlx5dr_definer_conv_item_vxlan(struct mlx5dr_definer_conv_data *cd, if (!m) return 0; - if (m->flags) { - fc = &cd->fc[MLX5DR_DEFINER_FNAME_VXLAN_FLAGS]; + if (m->hdr.vx_flags) { + fc = &cd->fc[MLX5DR_DEFINER_FNAME_VXLAN_DW0]; fc->item_idx = item_idx; - fc->tag_set = &mlx5dr_definer_vxlan_flags_set; + fc->tag_set = &mlx5dr_definer_vxlan_vx_flags_set; DR_CALC_SET_HDR(fc, tunnel_header, tunnel_header_0); - fc->bit_mask = __mlx5_mask(header_vxlan, flags); - fc->bit_off = __mlx5_dw_bit_off(header_vxlan, flags); } - if (!is_mem_zero(m->vni, 3)) { - fc = &cd->fc[MLX5DR_DEFINER_FNAME_VXLAN_VNI]; + if (m->hdr.vx_vni) { + fc = &cd->fc[MLX5DR_DEFINER_FNAME_VXLAN_DW1]; fc->item_idx = item_idx; - fc->tag_set = &mlx5dr_definer_vxlan_vni_set; + fc->tag_set = &mlx5dr_definer_vxlan_vx_vni_set; DR_CALC_SET_HDR(fc, tunnel_header, tunnel_header_1); - fc->bit_mask = __mlx5_mask(header_vxlan, vni); - fc->bit_off = __mlx5_dw_bit_off(header_vxlan, vni); } return 0; diff --git a/drivers/net/mlx5/hws/mlx5dr_definer.h b/drivers/net/mlx5/hws/mlx5dr_definer.h index a42ba9b81a..8f34ea64c8 100644 --- a/drivers/net/mlx5/hws/mlx5dr_definer.h +++ b/drivers/net/mlx5/hws/mlx5dr_definer.h @@ -122,8 +122,8 @@ enum mlx5dr_definer_fname { MLX5DR_DEFINER_FNAME_FLEX_PARSER_6, MLX5DR_DEFINER_FNAME_FLEX_PARSER_7, MLX5DR_DEFINER_FNAME_VPORT_REG_C_0, - MLX5DR_DEFINER_FNAME_VXLAN_FLAGS, - MLX5DR_DEFINER_FNAME_VXLAN_VNI, + MLX5DR_DEFINER_FNAME_VXLAN_DW0, + MLX5DR_DEFINER_FNAME_VXLAN_DW1, MLX5DR_DEFINER_FNAME_VXLAN_GPE_FLAGS, MLX5DR_DEFINER_FNAME_VXLAN_GPE_RSVD0, MLX5DR_DEFINER_FNAME_VXLAN_GPE_PROTO, -- 2.27.0