1*d65e841dSYevgeny Kliteynik // SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB 2*d65e841dSYevgeny Kliteynik /* Copyright (c) 2020 NVIDIA CORPORATION. All rights reserved. */ 3*d65e841dSYevgeny Kliteynik 4*d65e841dSYevgeny Kliteynik #include <linux/types.h> 5*d65e841dSYevgeny Kliteynik #include <linux/crc32.h> 6*d65e841dSYevgeny Kliteynik #include "dr_ste.h" 7*d65e841dSYevgeny Kliteynik 8*d65e841dSYevgeny Kliteynik #define DR_STE_CALC_LU_TYPE(lookup_type, rx, inner) \ 9*d65e841dSYevgeny Kliteynik ((inner) ? MLX5DR_STE_LU_TYPE_##lookup_type##_I : \ 10*d65e841dSYevgeny Kliteynik (rx) ? MLX5DR_STE_LU_TYPE_##lookup_type##_D : \ 11*d65e841dSYevgeny Kliteynik MLX5DR_STE_LU_TYPE_##lookup_type##_O) 12*d65e841dSYevgeny Kliteynik 13*d65e841dSYevgeny Kliteynik static void 14*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l2_src_dst_bit_mask(struct mlx5dr_match_param *value, 15*d65e841dSYevgeny Kliteynik bool inner, u8 *bit_mask) 16*d65e841dSYevgeny Kliteynik { 17*d65e841dSYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 18*d65e841dSYevgeny Kliteynik 19*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l2_src_dst, bit_mask, dmac_47_16, mask, dmac_47_16); 20*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l2_src_dst, bit_mask, dmac_15_0, mask, dmac_15_0); 21*d65e841dSYevgeny Kliteynik 22*d65e841dSYevgeny Kliteynik if (mask->smac_47_16 || mask->smac_15_0) { 23*d65e841dSYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst, bit_mask, smac_47_32, 24*d65e841dSYevgeny Kliteynik mask->smac_47_16 >> 16); 25*d65e841dSYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst, bit_mask, smac_31_0, 26*d65e841dSYevgeny Kliteynik mask->smac_47_16 << 16 | mask->smac_15_0); 27*d65e841dSYevgeny Kliteynik mask->smac_47_16 = 0; 28*d65e841dSYevgeny Kliteynik mask->smac_15_0 = 0; 29*d65e841dSYevgeny Kliteynik } 30*d65e841dSYevgeny Kliteynik 31*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l2_src_dst, bit_mask, first_vlan_id, mask, first_vid); 32*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l2_src_dst, bit_mask, first_cfi, mask, first_cfi); 33*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l2_src_dst, bit_mask, first_priority, mask, first_prio); 34*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK(eth_l2_src_dst, bit_mask, l3_type, mask, ip_version); 35*d65e841dSYevgeny Kliteynik 36*d65e841dSYevgeny Kliteynik if (mask->cvlan_tag) { 37*d65e841dSYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst, bit_mask, first_vlan_qualifier, -1); 38*d65e841dSYevgeny Kliteynik mask->cvlan_tag = 0; 39*d65e841dSYevgeny Kliteynik } else if (mask->svlan_tag) { 40*d65e841dSYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst, bit_mask, first_vlan_qualifier, -1); 41*d65e841dSYevgeny Kliteynik mask->svlan_tag = 0; 42*d65e841dSYevgeny Kliteynik } 43*d65e841dSYevgeny Kliteynik } 44*d65e841dSYevgeny Kliteynik 45*d65e841dSYevgeny Kliteynik static int 46*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l2_src_dst_tag(struct mlx5dr_match_param *value, 47*d65e841dSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 48*d65e841dSYevgeny Kliteynik u8 *tag) 49*d65e841dSYevgeny Kliteynik { 50*d65e841dSYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 51*d65e841dSYevgeny Kliteynik 52*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst, tag, dmac_47_16, spec, dmac_47_16); 53*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst, tag, dmac_15_0, spec, dmac_15_0); 54*d65e841dSYevgeny Kliteynik 55*d65e841dSYevgeny Kliteynik if (spec->smac_47_16 || spec->smac_15_0) { 56*d65e841dSYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst, tag, smac_47_32, 57*d65e841dSYevgeny Kliteynik spec->smac_47_16 >> 16); 58*d65e841dSYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst, tag, smac_31_0, 59*d65e841dSYevgeny Kliteynik spec->smac_47_16 << 16 | spec->smac_15_0); 60*d65e841dSYevgeny Kliteynik spec->smac_47_16 = 0; 61*d65e841dSYevgeny Kliteynik spec->smac_15_0 = 0; 62*d65e841dSYevgeny Kliteynik } 63*d65e841dSYevgeny Kliteynik 64*d65e841dSYevgeny Kliteynik if (spec->ip_version) { 65*d65e841dSYevgeny Kliteynik if (spec->ip_version == IP_VERSION_IPV4) { 66*d65e841dSYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst, tag, l3_type, STE_IPV4); 67*d65e841dSYevgeny Kliteynik spec->ip_version = 0; 68*d65e841dSYevgeny Kliteynik } else if (spec->ip_version == IP_VERSION_IPV6) { 69*d65e841dSYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst, tag, l3_type, STE_IPV6); 70*d65e841dSYevgeny Kliteynik spec->ip_version = 0; 71*d65e841dSYevgeny Kliteynik } else { 72*d65e841dSYevgeny Kliteynik return -EINVAL; 73*d65e841dSYevgeny Kliteynik } 74*d65e841dSYevgeny Kliteynik } 75*d65e841dSYevgeny Kliteynik 76*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst, tag, first_vlan_id, spec, first_vid); 77*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst, tag, first_cfi, spec, first_cfi); 78*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst, tag, first_priority, spec, first_prio); 79*d65e841dSYevgeny Kliteynik 80*d65e841dSYevgeny Kliteynik if (spec->cvlan_tag) { 81*d65e841dSYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst, tag, first_vlan_qualifier, DR_STE_CVLAN); 82*d65e841dSYevgeny Kliteynik spec->cvlan_tag = 0; 83*d65e841dSYevgeny Kliteynik } else if (spec->svlan_tag) { 84*d65e841dSYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst, tag, first_vlan_qualifier, DR_STE_SVLAN); 85*d65e841dSYevgeny Kliteynik spec->svlan_tag = 0; 86*d65e841dSYevgeny Kliteynik } 87*d65e841dSYevgeny Kliteynik return 0; 88*d65e841dSYevgeny Kliteynik } 89*d65e841dSYevgeny Kliteynik 90*d65e841dSYevgeny Kliteynik static void 91*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l2_src_dst_init(struct mlx5dr_ste_build *sb, 92*d65e841dSYevgeny Kliteynik struct mlx5dr_match_param *mask) 93*d65e841dSYevgeny Kliteynik { 94*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l2_src_dst_bit_mask(mask, sb->inner, sb->bit_mask); 95*d65e841dSYevgeny Kliteynik 96*d65e841dSYevgeny Kliteynik sb->lu_type = DR_STE_CALC_LU_TYPE(ETHL2_SRC_DST, sb->rx, sb->inner); 97*d65e841dSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 98*d65e841dSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v0_build_eth_l2_src_dst_tag; 99*d65e841dSYevgeny Kliteynik } 100*d65e841dSYevgeny Kliteynik 101*d65e841dSYevgeny Kliteynik static void 102*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l3_ipv6_dst_bit_mask(struct mlx5dr_match_param *value, 103*d65e841dSYevgeny Kliteynik bool inner, u8 *bit_mask) 104*d65e841dSYevgeny Kliteynik { 105*d65e841dSYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 106*d65e841dSYevgeny Kliteynik 107*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l3_ipv6_dst, bit_mask, dst_ip_127_96, mask, dst_ip_127_96); 108*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l3_ipv6_dst, bit_mask, dst_ip_95_64, mask, dst_ip_95_64); 109*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l3_ipv6_dst, bit_mask, dst_ip_63_32, mask, dst_ip_63_32); 110*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l3_ipv6_dst, bit_mask, dst_ip_31_0, mask, dst_ip_31_0); 111*d65e841dSYevgeny Kliteynik } 112*d65e841dSYevgeny Kliteynik 113*d65e841dSYevgeny Kliteynik static int 114*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l3_ipv6_dst_tag(struct mlx5dr_match_param *value, 115*d65e841dSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 116*d65e841dSYevgeny Kliteynik u8 *tag) 117*d65e841dSYevgeny Kliteynik { 118*d65e841dSYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 119*d65e841dSYevgeny Kliteynik 120*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_dst, tag, dst_ip_127_96, spec, dst_ip_127_96); 121*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_dst, tag, dst_ip_95_64, spec, dst_ip_95_64); 122*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_dst, tag, dst_ip_63_32, spec, dst_ip_63_32); 123*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_dst, tag, dst_ip_31_0, spec, dst_ip_31_0); 124*d65e841dSYevgeny Kliteynik 125*d65e841dSYevgeny Kliteynik return 0; 126*d65e841dSYevgeny Kliteynik } 127*d65e841dSYevgeny Kliteynik 128*d65e841dSYevgeny Kliteynik static void 129*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l3_ipv6_dst_init(struct mlx5dr_ste_build *sb, 130*d65e841dSYevgeny Kliteynik struct mlx5dr_match_param *mask) 131*d65e841dSYevgeny Kliteynik { 132*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l3_ipv6_dst_bit_mask(mask, sb->inner, sb->bit_mask); 133*d65e841dSYevgeny Kliteynik 134*d65e841dSYevgeny Kliteynik sb->lu_type = DR_STE_CALC_LU_TYPE(ETHL3_IPV6_DST, sb->rx, sb->inner); 135*d65e841dSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 136*d65e841dSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v0_build_eth_l3_ipv6_dst_tag; 137*d65e841dSYevgeny Kliteynik } 138*d65e841dSYevgeny Kliteynik 139*d65e841dSYevgeny Kliteynik static void 140*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l3_ipv6_src_bit_mask(struct mlx5dr_match_param *value, 141*d65e841dSYevgeny Kliteynik bool inner, u8 *bit_mask) 142*d65e841dSYevgeny Kliteynik { 143*d65e841dSYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 144*d65e841dSYevgeny Kliteynik 145*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l3_ipv6_src, bit_mask, src_ip_127_96, mask, src_ip_127_96); 146*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l3_ipv6_src, bit_mask, src_ip_95_64, mask, src_ip_95_64); 147*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l3_ipv6_src, bit_mask, src_ip_63_32, mask, src_ip_63_32); 148*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l3_ipv6_src, bit_mask, src_ip_31_0, mask, src_ip_31_0); 149*d65e841dSYevgeny Kliteynik } 150*d65e841dSYevgeny Kliteynik 151*d65e841dSYevgeny Kliteynik static int 152*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l3_ipv6_src_tag(struct mlx5dr_match_param *value, 153*d65e841dSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 154*d65e841dSYevgeny Kliteynik u8 *tag) 155*d65e841dSYevgeny Kliteynik { 156*d65e841dSYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 157*d65e841dSYevgeny Kliteynik 158*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_src, tag, src_ip_127_96, spec, src_ip_127_96); 159*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_src, tag, src_ip_95_64, spec, src_ip_95_64); 160*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_src, tag, src_ip_63_32, spec, src_ip_63_32); 161*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_src, tag, src_ip_31_0, spec, src_ip_31_0); 162*d65e841dSYevgeny Kliteynik 163*d65e841dSYevgeny Kliteynik return 0; 164*d65e841dSYevgeny Kliteynik } 165*d65e841dSYevgeny Kliteynik 166*d65e841dSYevgeny Kliteynik static void 167*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l3_ipv6_src_init(struct mlx5dr_ste_build *sb, 168*d65e841dSYevgeny Kliteynik struct mlx5dr_match_param *mask) 169*d65e841dSYevgeny Kliteynik { 170*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l3_ipv6_src_bit_mask(mask, sb->inner, sb->bit_mask); 171*d65e841dSYevgeny Kliteynik 172*d65e841dSYevgeny Kliteynik sb->lu_type = DR_STE_CALC_LU_TYPE(ETHL3_IPV6_SRC, sb->rx, sb->inner); 173*d65e841dSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 174*d65e841dSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v0_build_eth_l3_ipv6_src_tag; 175*d65e841dSYevgeny Kliteynik } 176*d65e841dSYevgeny Kliteynik 177*d65e841dSYevgeny Kliteynik static void 178*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l3_ipv4_5_tuple_bit_mask(struct mlx5dr_match_param *value, 179*d65e841dSYevgeny Kliteynik bool inner, 180*d65e841dSYevgeny Kliteynik u8 *bit_mask) 181*d65e841dSYevgeny Kliteynik { 182*d65e841dSYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 183*d65e841dSYevgeny Kliteynik 184*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l3_ipv4_5_tuple, bit_mask, 185*d65e841dSYevgeny Kliteynik destination_address, mask, dst_ip_31_0); 186*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l3_ipv4_5_tuple, bit_mask, 187*d65e841dSYevgeny Kliteynik source_address, mask, src_ip_31_0); 188*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l3_ipv4_5_tuple, bit_mask, 189*d65e841dSYevgeny Kliteynik destination_port, mask, tcp_dport); 190*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l3_ipv4_5_tuple, bit_mask, 191*d65e841dSYevgeny Kliteynik destination_port, mask, udp_dport); 192*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l3_ipv4_5_tuple, bit_mask, 193*d65e841dSYevgeny Kliteynik source_port, mask, tcp_sport); 194*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l3_ipv4_5_tuple, bit_mask, 195*d65e841dSYevgeny Kliteynik source_port, mask, udp_sport); 196*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l3_ipv4_5_tuple, bit_mask, 197*d65e841dSYevgeny Kliteynik protocol, mask, ip_protocol); 198*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l3_ipv4_5_tuple, bit_mask, 199*d65e841dSYevgeny Kliteynik fragmented, mask, frag); 200*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l3_ipv4_5_tuple, bit_mask, 201*d65e841dSYevgeny Kliteynik dscp, mask, ip_dscp); 202*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l3_ipv4_5_tuple, bit_mask, 203*d65e841dSYevgeny Kliteynik ecn, mask, ip_ecn); 204*d65e841dSYevgeny Kliteynik 205*d65e841dSYevgeny Kliteynik if (mask->tcp_flags) { 206*d65e841dSYevgeny Kliteynik DR_STE_SET_TCP_FLAGS(eth_l3_ipv4_5_tuple, bit_mask, mask); 207*d65e841dSYevgeny Kliteynik mask->tcp_flags = 0; 208*d65e841dSYevgeny Kliteynik } 209*d65e841dSYevgeny Kliteynik } 210*d65e841dSYevgeny Kliteynik 211*d65e841dSYevgeny Kliteynik static int 212*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l3_ipv4_5_tuple_tag(struct mlx5dr_match_param *value, 213*d65e841dSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 214*d65e841dSYevgeny Kliteynik u8 *tag) 215*d65e841dSYevgeny Kliteynik { 216*d65e841dSYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 217*d65e841dSYevgeny Kliteynik 218*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple, tag, destination_address, spec, dst_ip_31_0); 219*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple, tag, source_address, spec, src_ip_31_0); 220*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple, tag, destination_port, spec, tcp_dport); 221*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple, tag, destination_port, spec, udp_dport); 222*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple, tag, source_port, spec, tcp_sport); 223*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple, tag, source_port, spec, udp_sport); 224*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple, tag, protocol, spec, ip_protocol); 225*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple, tag, fragmented, spec, frag); 226*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple, tag, dscp, spec, ip_dscp); 227*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple, tag, ecn, spec, ip_ecn); 228*d65e841dSYevgeny Kliteynik 229*d65e841dSYevgeny Kliteynik if (spec->tcp_flags) { 230*d65e841dSYevgeny Kliteynik DR_STE_SET_TCP_FLAGS(eth_l3_ipv4_5_tuple, tag, spec); 231*d65e841dSYevgeny Kliteynik spec->tcp_flags = 0; 232*d65e841dSYevgeny Kliteynik } 233*d65e841dSYevgeny Kliteynik 234*d65e841dSYevgeny Kliteynik return 0; 235*d65e841dSYevgeny Kliteynik } 236*d65e841dSYevgeny Kliteynik 237*d65e841dSYevgeny Kliteynik static void 238*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l3_ipv4_5_tuple_init(struct mlx5dr_ste_build *sb, 239*d65e841dSYevgeny Kliteynik struct mlx5dr_match_param *mask) 240*d65e841dSYevgeny Kliteynik { 241*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l3_ipv4_5_tuple_bit_mask(mask, sb->inner, sb->bit_mask); 242*d65e841dSYevgeny Kliteynik 243*d65e841dSYevgeny Kliteynik sb->lu_type = DR_STE_CALC_LU_TYPE(ETHL3_IPV4_5_TUPLE, sb->rx, sb->inner); 244*d65e841dSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 245*d65e841dSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v0_build_eth_l3_ipv4_5_tuple_tag; 246*d65e841dSYevgeny Kliteynik } 247*d65e841dSYevgeny Kliteynik 248*d65e841dSYevgeny Kliteynik static void 249*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l2_src_or_dst_bit_mask(struct mlx5dr_match_param *value, 250*d65e841dSYevgeny Kliteynik bool inner, u8 *bit_mask) 251*d65e841dSYevgeny Kliteynik { 252*d65e841dSYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 253*d65e841dSYevgeny Kliteynik struct mlx5dr_match_misc *misc_mask = &value->misc; 254*d65e841dSYevgeny Kliteynik 255*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l2_src, bit_mask, first_vlan_id, mask, first_vid); 256*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l2_src, bit_mask, first_cfi, mask, first_cfi); 257*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l2_src, bit_mask, first_priority, mask, first_prio); 258*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l2_src, bit_mask, ip_fragmented, mask, frag); 259*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l2_src, bit_mask, l3_ethertype, mask, ethertype); 260*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK(eth_l2_src, bit_mask, l3_type, mask, ip_version); 261*d65e841dSYevgeny Kliteynik 262*d65e841dSYevgeny Kliteynik if (mask->svlan_tag || mask->cvlan_tag) { 263*d65e841dSYevgeny Kliteynik MLX5_SET(ste_eth_l2_src, bit_mask, first_vlan_qualifier, -1); 264*d65e841dSYevgeny Kliteynik mask->cvlan_tag = 0; 265*d65e841dSYevgeny Kliteynik mask->svlan_tag = 0; 266*d65e841dSYevgeny Kliteynik } 267*d65e841dSYevgeny Kliteynik 268*d65e841dSYevgeny Kliteynik if (inner) { 269*d65e841dSYevgeny Kliteynik if (misc_mask->inner_second_cvlan_tag || 270*d65e841dSYevgeny Kliteynik misc_mask->inner_second_svlan_tag) { 271*d65e841dSYevgeny Kliteynik MLX5_SET(ste_eth_l2_src, bit_mask, second_vlan_qualifier, -1); 272*d65e841dSYevgeny Kliteynik misc_mask->inner_second_cvlan_tag = 0; 273*d65e841dSYevgeny Kliteynik misc_mask->inner_second_svlan_tag = 0; 274*d65e841dSYevgeny Kliteynik } 275*d65e841dSYevgeny Kliteynik 276*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l2_src, bit_mask, 277*d65e841dSYevgeny Kliteynik second_vlan_id, misc_mask, inner_second_vid); 278*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l2_src, bit_mask, 279*d65e841dSYevgeny Kliteynik second_cfi, misc_mask, inner_second_cfi); 280*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l2_src, bit_mask, 281*d65e841dSYevgeny Kliteynik second_priority, misc_mask, inner_second_prio); 282*d65e841dSYevgeny Kliteynik } else { 283*d65e841dSYevgeny Kliteynik if (misc_mask->outer_second_cvlan_tag || 284*d65e841dSYevgeny Kliteynik misc_mask->outer_second_svlan_tag) { 285*d65e841dSYevgeny Kliteynik MLX5_SET(ste_eth_l2_src, bit_mask, second_vlan_qualifier, -1); 286*d65e841dSYevgeny Kliteynik misc_mask->outer_second_cvlan_tag = 0; 287*d65e841dSYevgeny Kliteynik misc_mask->outer_second_svlan_tag = 0; 288*d65e841dSYevgeny Kliteynik } 289*d65e841dSYevgeny Kliteynik 290*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l2_src, bit_mask, 291*d65e841dSYevgeny Kliteynik second_vlan_id, misc_mask, outer_second_vid); 292*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l2_src, bit_mask, 293*d65e841dSYevgeny Kliteynik second_cfi, misc_mask, outer_second_cfi); 294*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l2_src, bit_mask, 295*d65e841dSYevgeny Kliteynik second_priority, misc_mask, outer_second_prio); 296*d65e841dSYevgeny Kliteynik } 297*d65e841dSYevgeny Kliteynik } 298*d65e841dSYevgeny Kliteynik 299*d65e841dSYevgeny Kliteynik static int 300*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l2_src_or_dst_tag(struct mlx5dr_match_param *value, 301*d65e841dSYevgeny Kliteynik bool inner, u8 *tag) 302*d65e841dSYevgeny Kliteynik { 303*d65e841dSYevgeny Kliteynik struct mlx5dr_match_spec *spec = inner ? &value->inner : &value->outer; 304*d65e841dSYevgeny Kliteynik struct mlx5dr_match_misc *misc_spec = &value->misc; 305*d65e841dSYevgeny Kliteynik 306*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src, tag, first_vlan_id, spec, first_vid); 307*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src, tag, first_cfi, spec, first_cfi); 308*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src, tag, first_priority, spec, first_prio); 309*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src, tag, ip_fragmented, spec, frag); 310*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src, tag, l3_ethertype, spec, ethertype); 311*d65e841dSYevgeny Kliteynik 312*d65e841dSYevgeny Kliteynik if (spec->ip_version) { 313*d65e841dSYevgeny Kliteynik if (spec->ip_version == IP_VERSION_IPV4) { 314*d65e841dSYevgeny Kliteynik MLX5_SET(ste_eth_l2_src, tag, l3_type, STE_IPV4); 315*d65e841dSYevgeny Kliteynik spec->ip_version = 0; 316*d65e841dSYevgeny Kliteynik } else if (spec->ip_version == IP_VERSION_IPV6) { 317*d65e841dSYevgeny Kliteynik MLX5_SET(ste_eth_l2_src, tag, l3_type, STE_IPV6); 318*d65e841dSYevgeny Kliteynik spec->ip_version = 0; 319*d65e841dSYevgeny Kliteynik } else { 320*d65e841dSYevgeny Kliteynik return -EINVAL; 321*d65e841dSYevgeny Kliteynik } 322*d65e841dSYevgeny Kliteynik } 323*d65e841dSYevgeny Kliteynik 324*d65e841dSYevgeny Kliteynik if (spec->cvlan_tag) { 325*d65e841dSYevgeny Kliteynik MLX5_SET(ste_eth_l2_src, tag, first_vlan_qualifier, DR_STE_CVLAN); 326*d65e841dSYevgeny Kliteynik spec->cvlan_tag = 0; 327*d65e841dSYevgeny Kliteynik } else if (spec->svlan_tag) { 328*d65e841dSYevgeny Kliteynik MLX5_SET(ste_eth_l2_src, tag, first_vlan_qualifier, DR_STE_SVLAN); 329*d65e841dSYevgeny Kliteynik spec->svlan_tag = 0; 330*d65e841dSYevgeny Kliteynik } 331*d65e841dSYevgeny Kliteynik 332*d65e841dSYevgeny Kliteynik if (inner) { 333*d65e841dSYevgeny Kliteynik if (misc_spec->inner_second_cvlan_tag) { 334*d65e841dSYevgeny Kliteynik MLX5_SET(ste_eth_l2_src, tag, second_vlan_qualifier, DR_STE_CVLAN); 335*d65e841dSYevgeny Kliteynik misc_spec->inner_second_cvlan_tag = 0; 336*d65e841dSYevgeny Kliteynik } else if (misc_spec->inner_second_svlan_tag) { 337*d65e841dSYevgeny Kliteynik MLX5_SET(ste_eth_l2_src, tag, second_vlan_qualifier, DR_STE_SVLAN); 338*d65e841dSYevgeny Kliteynik misc_spec->inner_second_svlan_tag = 0; 339*d65e841dSYevgeny Kliteynik } 340*d65e841dSYevgeny Kliteynik 341*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src, tag, second_vlan_id, misc_spec, inner_second_vid); 342*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src, tag, second_cfi, misc_spec, inner_second_cfi); 343*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src, tag, second_priority, misc_spec, inner_second_prio); 344*d65e841dSYevgeny Kliteynik } else { 345*d65e841dSYevgeny Kliteynik if (misc_spec->outer_second_cvlan_tag) { 346*d65e841dSYevgeny Kliteynik MLX5_SET(ste_eth_l2_src, tag, second_vlan_qualifier, DR_STE_CVLAN); 347*d65e841dSYevgeny Kliteynik misc_spec->outer_second_cvlan_tag = 0; 348*d65e841dSYevgeny Kliteynik } else if (misc_spec->outer_second_svlan_tag) { 349*d65e841dSYevgeny Kliteynik MLX5_SET(ste_eth_l2_src, tag, second_vlan_qualifier, DR_STE_SVLAN); 350*d65e841dSYevgeny Kliteynik misc_spec->outer_second_svlan_tag = 0; 351*d65e841dSYevgeny Kliteynik } 352*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src, tag, second_vlan_id, misc_spec, outer_second_vid); 353*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src, tag, second_cfi, misc_spec, outer_second_cfi); 354*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src, tag, second_priority, misc_spec, outer_second_prio); 355*d65e841dSYevgeny Kliteynik } 356*d65e841dSYevgeny Kliteynik 357*d65e841dSYevgeny Kliteynik return 0; 358*d65e841dSYevgeny Kliteynik } 359*d65e841dSYevgeny Kliteynik 360*d65e841dSYevgeny Kliteynik static void 361*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l2_src_bit_mask(struct mlx5dr_match_param *value, 362*d65e841dSYevgeny Kliteynik bool inner, u8 *bit_mask) 363*d65e841dSYevgeny Kliteynik { 364*d65e841dSYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 365*d65e841dSYevgeny Kliteynik 366*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l2_src, bit_mask, smac_47_16, mask, smac_47_16); 367*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l2_src, bit_mask, smac_15_0, mask, smac_15_0); 368*d65e841dSYevgeny Kliteynik 369*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l2_src_or_dst_bit_mask(value, inner, bit_mask); 370*d65e841dSYevgeny Kliteynik } 371*d65e841dSYevgeny Kliteynik 372*d65e841dSYevgeny Kliteynik static int 373*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l2_src_tag(struct mlx5dr_match_param *value, 374*d65e841dSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 375*d65e841dSYevgeny Kliteynik u8 *tag) 376*d65e841dSYevgeny Kliteynik { 377*d65e841dSYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 378*d65e841dSYevgeny Kliteynik 379*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src, tag, smac_47_16, spec, smac_47_16); 380*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src, tag, smac_15_0, spec, smac_15_0); 381*d65e841dSYevgeny Kliteynik 382*d65e841dSYevgeny Kliteynik return dr_ste_v0_build_eth_l2_src_or_dst_tag(value, sb->inner, tag); 383*d65e841dSYevgeny Kliteynik } 384*d65e841dSYevgeny Kliteynik 385*d65e841dSYevgeny Kliteynik static void 386*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l2_src_init(struct mlx5dr_ste_build *sb, 387*d65e841dSYevgeny Kliteynik struct mlx5dr_match_param *mask) 388*d65e841dSYevgeny Kliteynik { 389*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l2_src_bit_mask(mask, sb->inner, sb->bit_mask); 390*d65e841dSYevgeny Kliteynik sb->lu_type = DR_STE_CALC_LU_TYPE(ETHL2_SRC, sb->rx, sb->inner); 391*d65e841dSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 392*d65e841dSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v0_build_eth_l2_src_tag; 393*d65e841dSYevgeny Kliteynik } 394*d65e841dSYevgeny Kliteynik 395*d65e841dSYevgeny Kliteynik static void 396*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l2_dst_bit_mask(struct mlx5dr_match_param *value, 397*d65e841dSYevgeny Kliteynik bool inner, u8 *bit_mask) 398*d65e841dSYevgeny Kliteynik { 399*d65e841dSYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 400*d65e841dSYevgeny Kliteynik 401*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l2_dst, bit_mask, dmac_47_16, mask, dmac_47_16); 402*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l2_dst, bit_mask, dmac_15_0, mask, dmac_15_0); 403*d65e841dSYevgeny Kliteynik 404*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l2_src_or_dst_bit_mask(value, inner, bit_mask); 405*d65e841dSYevgeny Kliteynik } 406*d65e841dSYevgeny Kliteynik 407*d65e841dSYevgeny Kliteynik static int 408*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l2_dst_tag(struct mlx5dr_match_param *value, 409*d65e841dSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 410*d65e841dSYevgeny Kliteynik u8 *tag) 411*d65e841dSYevgeny Kliteynik { 412*d65e841dSYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 413*d65e841dSYevgeny Kliteynik 414*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_dst, tag, dmac_47_16, spec, dmac_47_16); 415*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_dst, tag, dmac_15_0, spec, dmac_15_0); 416*d65e841dSYevgeny Kliteynik 417*d65e841dSYevgeny Kliteynik return dr_ste_v0_build_eth_l2_src_or_dst_tag(value, sb->inner, tag); 418*d65e841dSYevgeny Kliteynik } 419*d65e841dSYevgeny Kliteynik 420*d65e841dSYevgeny Kliteynik static void 421*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l2_dst_init(struct mlx5dr_ste_build *sb, 422*d65e841dSYevgeny Kliteynik struct mlx5dr_match_param *mask) 423*d65e841dSYevgeny Kliteynik { 424*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l2_dst_bit_mask(mask, sb->inner, sb->bit_mask); 425*d65e841dSYevgeny Kliteynik 426*d65e841dSYevgeny Kliteynik sb->lu_type = DR_STE_CALC_LU_TYPE(ETHL2_DST, sb->rx, sb->inner); 427*d65e841dSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 428*d65e841dSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v0_build_eth_l2_dst_tag; 429*d65e841dSYevgeny Kliteynik } 430*d65e841dSYevgeny Kliteynik 431*d65e841dSYevgeny Kliteynik static void 432*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l2_tnl_bit_mask(struct mlx5dr_match_param *value, 433*d65e841dSYevgeny Kliteynik bool inner, u8 *bit_mask) 434*d65e841dSYevgeny Kliteynik { 435*d65e841dSYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 436*d65e841dSYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 437*d65e841dSYevgeny Kliteynik 438*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l2_tnl, bit_mask, dmac_47_16, mask, dmac_47_16); 439*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l2_tnl, bit_mask, dmac_15_0, mask, dmac_15_0); 440*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l2_tnl, bit_mask, first_vlan_id, mask, first_vid); 441*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l2_tnl, bit_mask, first_cfi, mask, first_cfi); 442*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l2_tnl, bit_mask, first_priority, mask, first_prio); 443*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l2_tnl, bit_mask, ip_fragmented, mask, frag); 444*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l2_tnl, bit_mask, l3_ethertype, mask, ethertype); 445*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK(eth_l2_tnl, bit_mask, l3_type, mask, ip_version); 446*d65e841dSYevgeny Kliteynik 447*d65e841dSYevgeny Kliteynik if (misc->vxlan_vni) { 448*d65e841dSYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl, bit_mask, 449*d65e841dSYevgeny Kliteynik l2_tunneling_network_id, (misc->vxlan_vni << 8)); 450*d65e841dSYevgeny Kliteynik misc->vxlan_vni = 0; 451*d65e841dSYevgeny Kliteynik } 452*d65e841dSYevgeny Kliteynik 453*d65e841dSYevgeny Kliteynik if (mask->svlan_tag || mask->cvlan_tag) { 454*d65e841dSYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl, bit_mask, first_vlan_qualifier, -1); 455*d65e841dSYevgeny Kliteynik mask->cvlan_tag = 0; 456*d65e841dSYevgeny Kliteynik mask->svlan_tag = 0; 457*d65e841dSYevgeny Kliteynik } 458*d65e841dSYevgeny Kliteynik } 459*d65e841dSYevgeny Kliteynik 460*d65e841dSYevgeny Kliteynik static int 461*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l2_tnl_tag(struct mlx5dr_match_param *value, 462*d65e841dSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 463*d65e841dSYevgeny Kliteynik u8 *tag) 464*d65e841dSYevgeny Kliteynik { 465*d65e841dSYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 466*d65e841dSYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 467*d65e841dSYevgeny Kliteynik 468*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl, tag, dmac_47_16, spec, dmac_47_16); 469*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl, tag, dmac_15_0, spec, dmac_15_0); 470*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl, tag, first_vlan_id, spec, first_vid); 471*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl, tag, first_cfi, spec, first_cfi); 472*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl, tag, ip_fragmented, spec, frag); 473*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl, tag, first_priority, spec, first_prio); 474*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl, tag, l3_ethertype, spec, ethertype); 475*d65e841dSYevgeny Kliteynik 476*d65e841dSYevgeny Kliteynik if (misc->vxlan_vni) { 477*d65e841dSYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl, tag, l2_tunneling_network_id, 478*d65e841dSYevgeny Kliteynik (misc->vxlan_vni << 8)); 479*d65e841dSYevgeny Kliteynik misc->vxlan_vni = 0; 480*d65e841dSYevgeny Kliteynik } 481*d65e841dSYevgeny Kliteynik 482*d65e841dSYevgeny Kliteynik if (spec->cvlan_tag) { 483*d65e841dSYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl, tag, first_vlan_qualifier, DR_STE_CVLAN); 484*d65e841dSYevgeny Kliteynik spec->cvlan_tag = 0; 485*d65e841dSYevgeny Kliteynik } else if (spec->svlan_tag) { 486*d65e841dSYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl, tag, first_vlan_qualifier, DR_STE_SVLAN); 487*d65e841dSYevgeny Kliteynik spec->svlan_tag = 0; 488*d65e841dSYevgeny Kliteynik } 489*d65e841dSYevgeny Kliteynik 490*d65e841dSYevgeny Kliteynik if (spec->ip_version) { 491*d65e841dSYevgeny Kliteynik if (spec->ip_version == IP_VERSION_IPV4) { 492*d65e841dSYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl, tag, l3_type, STE_IPV4); 493*d65e841dSYevgeny Kliteynik spec->ip_version = 0; 494*d65e841dSYevgeny Kliteynik } else if (spec->ip_version == IP_VERSION_IPV6) { 495*d65e841dSYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl, tag, l3_type, STE_IPV6); 496*d65e841dSYevgeny Kliteynik spec->ip_version = 0; 497*d65e841dSYevgeny Kliteynik } else { 498*d65e841dSYevgeny Kliteynik return -EINVAL; 499*d65e841dSYevgeny Kliteynik } 500*d65e841dSYevgeny Kliteynik } 501*d65e841dSYevgeny Kliteynik 502*d65e841dSYevgeny Kliteynik return 0; 503*d65e841dSYevgeny Kliteynik } 504*d65e841dSYevgeny Kliteynik 505*d65e841dSYevgeny Kliteynik static void 506*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l2_tnl_init(struct mlx5dr_ste_build *sb, 507*d65e841dSYevgeny Kliteynik struct mlx5dr_match_param *mask) 508*d65e841dSYevgeny Kliteynik { 509*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l2_tnl_bit_mask(mask, sb->inner, sb->bit_mask); 510*d65e841dSYevgeny Kliteynik 511*d65e841dSYevgeny Kliteynik sb->lu_type = MLX5DR_STE_LU_TYPE_ETHL2_TUNNELING_I; 512*d65e841dSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 513*d65e841dSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v0_build_eth_l2_tnl_tag; 514*d65e841dSYevgeny Kliteynik } 515*d65e841dSYevgeny Kliteynik 516*d65e841dSYevgeny Kliteynik static void 517*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l3_ipv4_misc_bit_mask(struct mlx5dr_match_param *value, 518*d65e841dSYevgeny Kliteynik bool inner, u8 *bit_mask) 519*d65e841dSYevgeny Kliteynik { 520*d65e841dSYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 521*d65e841dSYevgeny Kliteynik 522*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l3_ipv4_misc, bit_mask, time_to_live, mask, ttl_hoplimit); 523*d65e841dSYevgeny Kliteynik } 524*d65e841dSYevgeny Kliteynik 525*d65e841dSYevgeny Kliteynik static int 526*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l3_ipv4_misc_tag(struct mlx5dr_match_param *value, 527*d65e841dSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 528*d65e841dSYevgeny Kliteynik u8 *tag) 529*d65e841dSYevgeny Kliteynik { 530*d65e841dSYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 531*d65e841dSYevgeny Kliteynik 532*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_misc, tag, time_to_live, spec, ttl_hoplimit); 533*d65e841dSYevgeny Kliteynik 534*d65e841dSYevgeny Kliteynik return 0; 535*d65e841dSYevgeny Kliteynik } 536*d65e841dSYevgeny Kliteynik 537*d65e841dSYevgeny Kliteynik static void 538*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l3_ipv4_misc_init(struct mlx5dr_ste_build *sb, 539*d65e841dSYevgeny Kliteynik struct mlx5dr_match_param *mask) 540*d65e841dSYevgeny Kliteynik { 541*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l3_ipv4_misc_bit_mask(mask, sb->inner, sb->bit_mask); 542*d65e841dSYevgeny Kliteynik 543*d65e841dSYevgeny Kliteynik sb->lu_type = DR_STE_CALC_LU_TYPE(ETHL3_IPV4_MISC, sb->rx, sb->inner); 544*d65e841dSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 545*d65e841dSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v0_build_eth_l3_ipv4_misc_tag; 546*d65e841dSYevgeny Kliteynik } 547*d65e841dSYevgeny Kliteynik 548*d65e841dSYevgeny Kliteynik static void 549*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_ipv6_l3_l4_bit_mask(struct mlx5dr_match_param *value, 550*d65e841dSYevgeny Kliteynik bool inner, u8 *bit_mask) 551*d65e841dSYevgeny Kliteynik { 552*d65e841dSYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 553*d65e841dSYevgeny Kliteynik 554*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l4, bit_mask, dst_port, mask, tcp_dport); 555*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l4, bit_mask, src_port, mask, tcp_sport); 556*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l4, bit_mask, dst_port, mask, udp_dport); 557*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l4, bit_mask, src_port, mask, udp_sport); 558*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l4, bit_mask, protocol, mask, ip_protocol); 559*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l4, bit_mask, fragmented, mask, frag); 560*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l4, bit_mask, dscp, mask, ip_dscp); 561*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l4, bit_mask, ecn, mask, ip_ecn); 562*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l4, bit_mask, ipv6_hop_limit, mask, ttl_hoplimit); 563*d65e841dSYevgeny Kliteynik 564*d65e841dSYevgeny Kliteynik if (mask->tcp_flags) { 565*d65e841dSYevgeny Kliteynik DR_STE_SET_TCP_FLAGS(eth_l4, bit_mask, mask); 566*d65e841dSYevgeny Kliteynik mask->tcp_flags = 0; 567*d65e841dSYevgeny Kliteynik } 568*d65e841dSYevgeny Kliteynik } 569*d65e841dSYevgeny Kliteynik 570*d65e841dSYevgeny Kliteynik static int 571*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_ipv6_l3_l4_tag(struct mlx5dr_match_param *value, 572*d65e841dSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 573*d65e841dSYevgeny Kliteynik u8 *tag) 574*d65e841dSYevgeny Kliteynik { 575*d65e841dSYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 576*d65e841dSYevgeny Kliteynik 577*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l4, tag, dst_port, spec, tcp_dport); 578*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l4, tag, src_port, spec, tcp_sport); 579*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l4, tag, dst_port, spec, udp_dport); 580*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l4, tag, src_port, spec, udp_sport); 581*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l4, tag, protocol, spec, ip_protocol); 582*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l4, tag, fragmented, spec, frag); 583*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l4, tag, dscp, spec, ip_dscp); 584*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l4, tag, ecn, spec, ip_ecn); 585*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l4, tag, ipv6_hop_limit, spec, ttl_hoplimit); 586*d65e841dSYevgeny Kliteynik 587*d65e841dSYevgeny Kliteynik if (spec->tcp_flags) { 588*d65e841dSYevgeny Kliteynik DR_STE_SET_TCP_FLAGS(eth_l4, tag, spec); 589*d65e841dSYevgeny Kliteynik spec->tcp_flags = 0; 590*d65e841dSYevgeny Kliteynik } 591*d65e841dSYevgeny Kliteynik 592*d65e841dSYevgeny Kliteynik return 0; 593*d65e841dSYevgeny Kliteynik } 594*d65e841dSYevgeny Kliteynik 595*d65e841dSYevgeny Kliteynik static void 596*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_ipv6_l3_l4_init(struct mlx5dr_ste_build *sb, 597*d65e841dSYevgeny Kliteynik struct mlx5dr_match_param *mask) 598*d65e841dSYevgeny Kliteynik { 599*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_ipv6_l3_l4_bit_mask(mask, sb->inner, sb->bit_mask); 600*d65e841dSYevgeny Kliteynik 601*d65e841dSYevgeny Kliteynik sb->lu_type = DR_STE_CALC_LU_TYPE(ETHL4, sb->rx, sb->inner); 602*d65e841dSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 603*d65e841dSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v0_build_eth_ipv6_l3_l4_tag; 604*d65e841dSYevgeny Kliteynik } 605*d65e841dSYevgeny Kliteynik 606*d65e841dSYevgeny Kliteynik static void 607*d65e841dSYevgeny Kliteynik dr_ste_v0_build_mpls_bit_mask(struct mlx5dr_match_param *value, 608*d65e841dSYevgeny Kliteynik bool inner, u8 *bit_mask) 609*d65e841dSYevgeny Kliteynik { 610*d65e841dSYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2_mask = &value->misc2; 611*d65e841dSYevgeny Kliteynik 612*d65e841dSYevgeny Kliteynik if (inner) 613*d65e841dSYevgeny Kliteynik DR_STE_SET_MPLS_MASK(mpls, misc2_mask, inner, bit_mask); 614*d65e841dSYevgeny Kliteynik else 615*d65e841dSYevgeny Kliteynik DR_STE_SET_MPLS_MASK(mpls, misc2_mask, outer, bit_mask); 616*d65e841dSYevgeny Kliteynik } 617*d65e841dSYevgeny Kliteynik 618*d65e841dSYevgeny Kliteynik static int 619*d65e841dSYevgeny Kliteynik dr_ste_v0_build_mpls_tag(struct mlx5dr_match_param *value, 620*d65e841dSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 621*d65e841dSYevgeny Kliteynik u8 *tag) 622*d65e841dSYevgeny Kliteynik { 623*d65e841dSYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2_mask = &value->misc2; 624*d65e841dSYevgeny Kliteynik 625*d65e841dSYevgeny Kliteynik if (sb->inner) 626*d65e841dSYevgeny Kliteynik DR_STE_SET_MPLS_TAG(mpls, misc2_mask, inner, tag); 627*d65e841dSYevgeny Kliteynik else 628*d65e841dSYevgeny Kliteynik DR_STE_SET_MPLS_TAG(mpls, misc2_mask, outer, tag); 629*d65e841dSYevgeny Kliteynik 630*d65e841dSYevgeny Kliteynik return 0; 631*d65e841dSYevgeny Kliteynik } 632*d65e841dSYevgeny Kliteynik 633*d65e841dSYevgeny Kliteynik static void 634*d65e841dSYevgeny Kliteynik dr_ste_v0_build_mpls_init(struct mlx5dr_ste_build *sb, 635*d65e841dSYevgeny Kliteynik struct mlx5dr_match_param *mask) 636*d65e841dSYevgeny Kliteynik { 637*d65e841dSYevgeny Kliteynik dr_ste_v0_build_mpls_bit_mask(mask, sb->inner, sb->bit_mask); 638*d65e841dSYevgeny Kliteynik 639*d65e841dSYevgeny Kliteynik sb->lu_type = DR_STE_CALC_LU_TYPE(MPLS_FIRST, sb->rx, sb->inner); 640*d65e841dSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 641*d65e841dSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v0_build_mpls_tag; 642*d65e841dSYevgeny Kliteynik } 643*d65e841dSYevgeny Kliteynik 644*d65e841dSYevgeny Kliteynik static void 645*d65e841dSYevgeny Kliteynik dr_ste_v0_build_tnl_gre_bit_mask(struct mlx5dr_match_param *value, 646*d65e841dSYevgeny Kliteynik bool inner, u8 *bit_mask) 647*d65e841dSYevgeny Kliteynik { 648*d65e841dSYevgeny Kliteynik struct mlx5dr_match_misc *misc_mask = &value->misc; 649*d65e841dSYevgeny Kliteynik 650*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(gre, bit_mask, gre_protocol, misc_mask, gre_protocol); 651*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(gre, bit_mask, gre_k_present, misc_mask, gre_k_present); 652*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(gre, bit_mask, gre_key_h, misc_mask, gre_key_h); 653*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(gre, bit_mask, gre_key_l, misc_mask, gre_key_l); 654*d65e841dSYevgeny Kliteynik 655*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(gre, bit_mask, gre_c_present, misc_mask, gre_c_present); 656*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(gre, bit_mask, gre_s_present, misc_mask, gre_s_present); 657*d65e841dSYevgeny Kliteynik } 658*d65e841dSYevgeny Kliteynik 659*d65e841dSYevgeny Kliteynik static int 660*d65e841dSYevgeny Kliteynik dr_ste_v0_build_tnl_gre_tag(struct mlx5dr_match_param *value, 661*d65e841dSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 662*d65e841dSYevgeny Kliteynik u8 *tag) 663*d65e841dSYevgeny Kliteynik { 664*d65e841dSYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 665*d65e841dSYevgeny Kliteynik 666*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(gre, tag, gre_protocol, misc, gre_protocol); 667*d65e841dSYevgeny Kliteynik 668*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(gre, tag, gre_k_present, misc, gre_k_present); 669*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(gre, tag, gre_key_h, misc, gre_key_h); 670*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(gre, tag, gre_key_l, misc, gre_key_l); 671*d65e841dSYevgeny Kliteynik 672*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(gre, tag, gre_c_present, misc, gre_c_present); 673*d65e841dSYevgeny Kliteynik 674*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(gre, tag, gre_s_present, misc, gre_s_present); 675*d65e841dSYevgeny Kliteynik 676*d65e841dSYevgeny Kliteynik return 0; 677*d65e841dSYevgeny Kliteynik } 678*d65e841dSYevgeny Kliteynik 679*d65e841dSYevgeny Kliteynik static void 680*d65e841dSYevgeny Kliteynik dr_ste_v0_build_tnl_gre_init(struct mlx5dr_ste_build *sb, 681*d65e841dSYevgeny Kliteynik struct mlx5dr_match_param *mask) 682*d65e841dSYevgeny Kliteynik { 683*d65e841dSYevgeny Kliteynik dr_ste_v0_build_tnl_gre_bit_mask(mask, sb->inner, sb->bit_mask); 684*d65e841dSYevgeny Kliteynik 685*d65e841dSYevgeny Kliteynik sb->lu_type = MLX5DR_STE_LU_TYPE_GRE; 686*d65e841dSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 687*d65e841dSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v0_build_tnl_gre_tag; 688*d65e841dSYevgeny Kliteynik } 689*d65e841dSYevgeny Kliteynik 690*d65e841dSYevgeny Kliteynik static void 691*d65e841dSYevgeny Kliteynik dr_ste_v0_build_tnl_mpls_bit_mask(struct mlx5dr_match_param *value, 692*d65e841dSYevgeny Kliteynik bool inner, u8 *bit_mask) 693*d65e841dSYevgeny Kliteynik { 694*d65e841dSYevgeny Kliteynik struct mlx5dr_match_misc2 *misc_2_mask = &value->misc2; 695*d65e841dSYevgeny Kliteynik 696*d65e841dSYevgeny Kliteynik if (DR_STE_IS_OUTER_MPLS_OVER_GRE_SET(misc_2_mask)) { 697*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(flex_parser_0, bit_mask, parser_3_label, 698*d65e841dSYevgeny Kliteynik misc_2_mask, outer_first_mpls_over_gre_label); 699*d65e841dSYevgeny Kliteynik 700*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(flex_parser_0, bit_mask, parser_3_exp, 701*d65e841dSYevgeny Kliteynik misc_2_mask, outer_first_mpls_over_gre_exp); 702*d65e841dSYevgeny Kliteynik 703*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(flex_parser_0, bit_mask, parser_3_s_bos, 704*d65e841dSYevgeny Kliteynik misc_2_mask, outer_first_mpls_over_gre_s_bos); 705*d65e841dSYevgeny Kliteynik 706*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(flex_parser_0, bit_mask, parser_3_ttl, 707*d65e841dSYevgeny Kliteynik misc_2_mask, outer_first_mpls_over_gre_ttl); 708*d65e841dSYevgeny Kliteynik } else { 709*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(flex_parser_0, bit_mask, parser_3_label, 710*d65e841dSYevgeny Kliteynik misc_2_mask, outer_first_mpls_over_udp_label); 711*d65e841dSYevgeny Kliteynik 712*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(flex_parser_0, bit_mask, parser_3_exp, 713*d65e841dSYevgeny Kliteynik misc_2_mask, outer_first_mpls_over_udp_exp); 714*d65e841dSYevgeny Kliteynik 715*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(flex_parser_0, bit_mask, parser_3_s_bos, 716*d65e841dSYevgeny Kliteynik misc_2_mask, outer_first_mpls_over_udp_s_bos); 717*d65e841dSYevgeny Kliteynik 718*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(flex_parser_0, bit_mask, parser_3_ttl, 719*d65e841dSYevgeny Kliteynik misc_2_mask, outer_first_mpls_over_udp_ttl); 720*d65e841dSYevgeny Kliteynik } 721*d65e841dSYevgeny Kliteynik } 722*d65e841dSYevgeny Kliteynik 723*d65e841dSYevgeny Kliteynik static int 724*d65e841dSYevgeny Kliteynik dr_ste_v0_build_tnl_mpls_tag(struct mlx5dr_match_param *value, 725*d65e841dSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 726*d65e841dSYevgeny Kliteynik u8 *tag) 727*d65e841dSYevgeny Kliteynik { 728*d65e841dSYevgeny Kliteynik struct mlx5dr_match_misc2 *misc_2_mask = &value->misc2; 729*d65e841dSYevgeny Kliteynik 730*d65e841dSYevgeny Kliteynik if (DR_STE_IS_OUTER_MPLS_OVER_GRE_SET(misc_2_mask)) { 731*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_0, tag, parser_3_label, 732*d65e841dSYevgeny Kliteynik misc_2_mask, outer_first_mpls_over_gre_label); 733*d65e841dSYevgeny Kliteynik 734*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_0, tag, parser_3_exp, 735*d65e841dSYevgeny Kliteynik misc_2_mask, outer_first_mpls_over_gre_exp); 736*d65e841dSYevgeny Kliteynik 737*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_0, tag, parser_3_s_bos, 738*d65e841dSYevgeny Kliteynik misc_2_mask, outer_first_mpls_over_gre_s_bos); 739*d65e841dSYevgeny Kliteynik 740*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_0, tag, parser_3_ttl, 741*d65e841dSYevgeny Kliteynik misc_2_mask, outer_first_mpls_over_gre_ttl); 742*d65e841dSYevgeny Kliteynik } else { 743*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_0, tag, parser_3_label, 744*d65e841dSYevgeny Kliteynik misc_2_mask, outer_first_mpls_over_udp_label); 745*d65e841dSYevgeny Kliteynik 746*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_0, tag, parser_3_exp, 747*d65e841dSYevgeny Kliteynik misc_2_mask, outer_first_mpls_over_udp_exp); 748*d65e841dSYevgeny Kliteynik 749*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_0, tag, parser_3_s_bos, 750*d65e841dSYevgeny Kliteynik misc_2_mask, outer_first_mpls_over_udp_s_bos); 751*d65e841dSYevgeny Kliteynik 752*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_0, tag, parser_3_ttl, 753*d65e841dSYevgeny Kliteynik misc_2_mask, outer_first_mpls_over_udp_ttl); 754*d65e841dSYevgeny Kliteynik } 755*d65e841dSYevgeny Kliteynik return 0; 756*d65e841dSYevgeny Kliteynik } 757*d65e841dSYevgeny Kliteynik 758*d65e841dSYevgeny Kliteynik static void 759*d65e841dSYevgeny Kliteynik dr_ste_v0_build_tnl_mpls_init(struct mlx5dr_ste_build *sb, 760*d65e841dSYevgeny Kliteynik struct mlx5dr_match_param *mask) 761*d65e841dSYevgeny Kliteynik { 762*d65e841dSYevgeny Kliteynik dr_ste_v0_build_tnl_mpls_bit_mask(mask, sb->inner, sb->bit_mask); 763*d65e841dSYevgeny Kliteynik 764*d65e841dSYevgeny Kliteynik sb->lu_type = MLX5DR_STE_LU_TYPE_FLEX_PARSER_0; 765*d65e841dSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 766*d65e841dSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v0_build_tnl_mpls_tag; 767*d65e841dSYevgeny Kliteynik } 768*d65e841dSYevgeny Kliteynik 769*d65e841dSYevgeny Kliteynik #define ICMP_TYPE_OFFSET_FIRST_DW 24 770*d65e841dSYevgeny Kliteynik #define ICMP_CODE_OFFSET_FIRST_DW 16 771*d65e841dSYevgeny Kliteynik #define ICMP_HEADER_DATA_OFFSET_SECOND_DW 0 772*d65e841dSYevgeny Kliteynik 773*d65e841dSYevgeny Kliteynik static int 774*d65e841dSYevgeny Kliteynik dr_ste_v0_build_icmp_bit_mask(struct mlx5dr_match_param *mask, 775*d65e841dSYevgeny Kliteynik struct mlx5dr_cmd_caps *caps, 776*d65e841dSYevgeny Kliteynik u8 *bit_mask) 777*d65e841dSYevgeny Kliteynik { 778*d65e841dSYevgeny Kliteynik struct mlx5dr_match_misc3 *misc_3_mask = &mask->misc3; 779*d65e841dSYevgeny Kliteynik bool is_ipv4_mask = DR_MASK_IS_ICMPV4_SET(misc_3_mask); 780*d65e841dSYevgeny Kliteynik u32 icmp_header_data_mask; 781*d65e841dSYevgeny Kliteynik u32 icmp_type_mask; 782*d65e841dSYevgeny Kliteynik u32 icmp_code_mask; 783*d65e841dSYevgeny Kliteynik int dw0_location; 784*d65e841dSYevgeny Kliteynik int dw1_location; 785*d65e841dSYevgeny Kliteynik 786*d65e841dSYevgeny Kliteynik if (is_ipv4_mask) { 787*d65e841dSYevgeny Kliteynik icmp_header_data_mask = misc_3_mask->icmpv4_header_data; 788*d65e841dSYevgeny Kliteynik icmp_type_mask = misc_3_mask->icmpv4_type; 789*d65e841dSYevgeny Kliteynik icmp_code_mask = misc_3_mask->icmpv4_code; 790*d65e841dSYevgeny Kliteynik dw0_location = caps->flex_parser_id_icmp_dw0; 791*d65e841dSYevgeny Kliteynik dw1_location = caps->flex_parser_id_icmp_dw1; 792*d65e841dSYevgeny Kliteynik } else { 793*d65e841dSYevgeny Kliteynik icmp_header_data_mask = misc_3_mask->icmpv6_header_data; 794*d65e841dSYevgeny Kliteynik icmp_type_mask = misc_3_mask->icmpv6_type; 795*d65e841dSYevgeny Kliteynik icmp_code_mask = misc_3_mask->icmpv6_code; 796*d65e841dSYevgeny Kliteynik dw0_location = caps->flex_parser_id_icmpv6_dw0; 797*d65e841dSYevgeny Kliteynik dw1_location = caps->flex_parser_id_icmpv6_dw1; 798*d65e841dSYevgeny Kliteynik } 799*d65e841dSYevgeny Kliteynik 800*d65e841dSYevgeny Kliteynik switch (dw0_location) { 801*d65e841dSYevgeny Kliteynik case 4: 802*d65e841dSYevgeny Kliteynik if (icmp_type_mask) { 803*d65e841dSYevgeny Kliteynik MLX5_SET(ste_flex_parser_1, bit_mask, flex_parser_4, 804*d65e841dSYevgeny Kliteynik (icmp_type_mask << ICMP_TYPE_OFFSET_FIRST_DW)); 805*d65e841dSYevgeny Kliteynik if (is_ipv4_mask) 806*d65e841dSYevgeny Kliteynik misc_3_mask->icmpv4_type = 0; 807*d65e841dSYevgeny Kliteynik else 808*d65e841dSYevgeny Kliteynik misc_3_mask->icmpv6_type = 0; 809*d65e841dSYevgeny Kliteynik } 810*d65e841dSYevgeny Kliteynik if (icmp_code_mask) { 811*d65e841dSYevgeny Kliteynik u32 cur_val = MLX5_GET(ste_flex_parser_1, bit_mask, 812*d65e841dSYevgeny Kliteynik flex_parser_4); 813*d65e841dSYevgeny Kliteynik MLX5_SET(ste_flex_parser_1, bit_mask, flex_parser_4, 814*d65e841dSYevgeny Kliteynik cur_val | (icmp_code_mask << ICMP_CODE_OFFSET_FIRST_DW)); 815*d65e841dSYevgeny Kliteynik if (is_ipv4_mask) 816*d65e841dSYevgeny Kliteynik misc_3_mask->icmpv4_code = 0; 817*d65e841dSYevgeny Kliteynik else 818*d65e841dSYevgeny Kliteynik misc_3_mask->icmpv6_code = 0; 819*d65e841dSYevgeny Kliteynik } 820*d65e841dSYevgeny Kliteynik break; 821*d65e841dSYevgeny Kliteynik default: 822*d65e841dSYevgeny Kliteynik return -EINVAL; 823*d65e841dSYevgeny Kliteynik } 824*d65e841dSYevgeny Kliteynik 825*d65e841dSYevgeny Kliteynik switch (dw1_location) { 826*d65e841dSYevgeny Kliteynik case 5: 827*d65e841dSYevgeny Kliteynik if (icmp_header_data_mask) { 828*d65e841dSYevgeny Kliteynik MLX5_SET(ste_flex_parser_1, bit_mask, flex_parser_5, 829*d65e841dSYevgeny Kliteynik (icmp_header_data_mask << ICMP_HEADER_DATA_OFFSET_SECOND_DW)); 830*d65e841dSYevgeny Kliteynik if (is_ipv4_mask) 831*d65e841dSYevgeny Kliteynik misc_3_mask->icmpv4_header_data = 0; 832*d65e841dSYevgeny Kliteynik else 833*d65e841dSYevgeny Kliteynik misc_3_mask->icmpv6_header_data = 0; 834*d65e841dSYevgeny Kliteynik } 835*d65e841dSYevgeny Kliteynik break; 836*d65e841dSYevgeny Kliteynik default: 837*d65e841dSYevgeny Kliteynik return -EINVAL; 838*d65e841dSYevgeny Kliteynik } 839*d65e841dSYevgeny Kliteynik 840*d65e841dSYevgeny Kliteynik return 0; 841*d65e841dSYevgeny Kliteynik } 842*d65e841dSYevgeny Kliteynik 843*d65e841dSYevgeny Kliteynik static int 844*d65e841dSYevgeny Kliteynik dr_ste_v0_build_icmp_tag(struct mlx5dr_match_param *value, 845*d65e841dSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 846*d65e841dSYevgeny Kliteynik u8 *tag) 847*d65e841dSYevgeny Kliteynik { 848*d65e841dSYevgeny Kliteynik struct mlx5dr_match_misc3 *misc_3 = &value->misc3; 849*d65e841dSYevgeny Kliteynik u32 icmp_header_data; 850*d65e841dSYevgeny Kliteynik int dw0_location; 851*d65e841dSYevgeny Kliteynik int dw1_location; 852*d65e841dSYevgeny Kliteynik u32 icmp_type; 853*d65e841dSYevgeny Kliteynik u32 icmp_code; 854*d65e841dSYevgeny Kliteynik bool is_ipv4; 855*d65e841dSYevgeny Kliteynik 856*d65e841dSYevgeny Kliteynik is_ipv4 = DR_MASK_IS_ICMPV4_SET(misc_3); 857*d65e841dSYevgeny Kliteynik if (is_ipv4) { 858*d65e841dSYevgeny Kliteynik icmp_header_data = misc_3->icmpv4_header_data; 859*d65e841dSYevgeny Kliteynik icmp_type = misc_3->icmpv4_type; 860*d65e841dSYevgeny Kliteynik icmp_code = misc_3->icmpv4_code; 861*d65e841dSYevgeny Kliteynik dw0_location = sb->caps->flex_parser_id_icmp_dw0; 862*d65e841dSYevgeny Kliteynik dw1_location = sb->caps->flex_parser_id_icmp_dw1; 863*d65e841dSYevgeny Kliteynik } else { 864*d65e841dSYevgeny Kliteynik icmp_header_data = misc_3->icmpv6_header_data; 865*d65e841dSYevgeny Kliteynik icmp_type = misc_3->icmpv6_type; 866*d65e841dSYevgeny Kliteynik icmp_code = misc_3->icmpv6_code; 867*d65e841dSYevgeny Kliteynik dw0_location = sb->caps->flex_parser_id_icmpv6_dw0; 868*d65e841dSYevgeny Kliteynik dw1_location = sb->caps->flex_parser_id_icmpv6_dw1; 869*d65e841dSYevgeny Kliteynik } 870*d65e841dSYevgeny Kliteynik 871*d65e841dSYevgeny Kliteynik switch (dw0_location) { 872*d65e841dSYevgeny Kliteynik case 4: 873*d65e841dSYevgeny Kliteynik if (icmp_type) { 874*d65e841dSYevgeny Kliteynik MLX5_SET(ste_flex_parser_1, tag, flex_parser_4, 875*d65e841dSYevgeny Kliteynik (icmp_type << ICMP_TYPE_OFFSET_FIRST_DW)); 876*d65e841dSYevgeny Kliteynik if (is_ipv4) 877*d65e841dSYevgeny Kliteynik misc_3->icmpv4_type = 0; 878*d65e841dSYevgeny Kliteynik else 879*d65e841dSYevgeny Kliteynik misc_3->icmpv6_type = 0; 880*d65e841dSYevgeny Kliteynik } 881*d65e841dSYevgeny Kliteynik 882*d65e841dSYevgeny Kliteynik if (icmp_code) { 883*d65e841dSYevgeny Kliteynik u32 cur_val = MLX5_GET(ste_flex_parser_1, tag, 884*d65e841dSYevgeny Kliteynik flex_parser_4); 885*d65e841dSYevgeny Kliteynik MLX5_SET(ste_flex_parser_1, tag, flex_parser_4, 886*d65e841dSYevgeny Kliteynik cur_val | (icmp_code << ICMP_CODE_OFFSET_FIRST_DW)); 887*d65e841dSYevgeny Kliteynik if (is_ipv4) 888*d65e841dSYevgeny Kliteynik misc_3->icmpv4_code = 0; 889*d65e841dSYevgeny Kliteynik else 890*d65e841dSYevgeny Kliteynik misc_3->icmpv6_code = 0; 891*d65e841dSYevgeny Kliteynik } 892*d65e841dSYevgeny Kliteynik break; 893*d65e841dSYevgeny Kliteynik default: 894*d65e841dSYevgeny Kliteynik return -EINVAL; 895*d65e841dSYevgeny Kliteynik } 896*d65e841dSYevgeny Kliteynik 897*d65e841dSYevgeny Kliteynik switch (dw1_location) { 898*d65e841dSYevgeny Kliteynik case 5: 899*d65e841dSYevgeny Kliteynik if (icmp_header_data) { 900*d65e841dSYevgeny Kliteynik MLX5_SET(ste_flex_parser_1, tag, flex_parser_5, 901*d65e841dSYevgeny Kliteynik (icmp_header_data << ICMP_HEADER_DATA_OFFSET_SECOND_DW)); 902*d65e841dSYevgeny Kliteynik if (is_ipv4) 903*d65e841dSYevgeny Kliteynik misc_3->icmpv4_header_data = 0; 904*d65e841dSYevgeny Kliteynik else 905*d65e841dSYevgeny Kliteynik misc_3->icmpv6_header_data = 0; 906*d65e841dSYevgeny Kliteynik } 907*d65e841dSYevgeny Kliteynik break; 908*d65e841dSYevgeny Kliteynik default: 909*d65e841dSYevgeny Kliteynik return -EINVAL; 910*d65e841dSYevgeny Kliteynik } 911*d65e841dSYevgeny Kliteynik 912*d65e841dSYevgeny Kliteynik return 0; 913*d65e841dSYevgeny Kliteynik } 914*d65e841dSYevgeny Kliteynik 915*d65e841dSYevgeny Kliteynik static int 916*d65e841dSYevgeny Kliteynik dr_ste_v0_build_icmp_init(struct mlx5dr_ste_build *sb, 917*d65e841dSYevgeny Kliteynik struct mlx5dr_match_param *mask) 918*d65e841dSYevgeny Kliteynik { 919*d65e841dSYevgeny Kliteynik int ret; 920*d65e841dSYevgeny Kliteynik 921*d65e841dSYevgeny Kliteynik ret = dr_ste_v0_build_icmp_bit_mask(mask, sb->caps, sb->bit_mask); 922*d65e841dSYevgeny Kliteynik if (ret) 923*d65e841dSYevgeny Kliteynik return ret; 924*d65e841dSYevgeny Kliteynik 925*d65e841dSYevgeny Kliteynik sb->lu_type = MLX5DR_STE_LU_TYPE_FLEX_PARSER_1; 926*d65e841dSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 927*d65e841dSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v0_build_icmp_tag; 928*d65e841dSYevgeny Kliteynik 929*d65e841dSYevgeny Kliteynik return 0; 930*d65e841dSYevgeny Kliteynik } 931*d65e841dSYevgeny Kliteynik 932*d65e841dSYevgeny Kliteynik static void 933*d65e841dSYevgeny Kliteynik dr_ste_v0_build_general_purpose_bit_mask(struct mlx5dr_match_param *value, 934*d65e841dSYevgeny Kliteynik bool inner, u8 *bit_mask) 935*d65e841dSYevgeny Kliteynik { 936*d65e841dSYevgeny Kliteynik struct mlx5dr_match_misc2 *misc_2_mask = &value->misc2; 937*d65e841dSYevgeny Kliteynik 938*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(general_purpose, bit_mask, 939*d65e841dSYevgeny Kliteynik general_purpose_lookup_field, misc_2_mask, 940*d65e841dSYevgeny Kliteynik metadata_reg_a); 941*d65e841dSYevgeny Kliteynik } 942*d65e841dSYevgeny Kliteynik 943*d65e841dSYevgeny Kliteynik static int 944*d65e841dSYevgeny Kliteynik dr_ste_v0_build_general_purpose_tag(struct mlx5dr_match_param *value, 945*d65e841dSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 946*d65e841dSYevgeny Kliteynik u8 *tag) 947*d65e841dSYevgeny Kliteynik { 948*d65e841dSYevgeny Kliteynik struct mlx5dr_match_misc2 *misc_2_mask = &value->misc2; 949*d65e841dSYevgeny Kliteynik 950*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(general_purpose, tag, general_purpose_lookup_field, 951*d65e841dSYevgeny Kliteynik misc_2_mask, metadata_reg_a); 952*d65e841dSYevgeny Kliteynik 953*d65e841dSYevgeny Kliteynik return 0; 954*d65e841dSYevgeny Kliteynik } 955*d65e841dSYevgeny Kliteynik 956*d65e841dSYevgeny Kliteynik static void 957*d65e841dSYevgeny Kliteynik dr_ste_v0_build_general_purpose_init(struct mlx5dr_ste_build *sb, 958*d65e841dSYevgeny Kliteynik struct mlx5dr_match_param *mask) 959*d65e841dSYevgeny Kliteynik { 960*d65e841dSYevgeny Kliteynik dr_ste_v0_build_general_purpose_bit_mask(mask, sb->inner, sb->bit_mask); 961*d65e841dSYevgeny Kliteynik 962*d65e841dSYevgeny Kliteynik sb->lu_type = MLX5DR_STE_LU_TYPE_GENERAL_PURPOSE; 963*d65e841dSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 964*d65e841dSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v0_build_general_purpose_tag; 965*d65e841dSYevgeny Kliteynik } 966*d65e841dSYevgeny Kliteynik 967*d65e841dSYevgeny Kliteynik static void 968*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l4_misc_bit_mask(struct mlx5dr_match_param *value, 969*d65e841dSYevgeny Kliteynik bool inner, u8 *bit_mask) 970*d65e841dSYevgeny Kliteynik { 971*d65e841dSYevgeny Kliteynik struct mlx5dr_match_misc3 *misc_3_mask = &value->misc3; 972*d65e841dSYevgeny Kliteynik 973*d65e841dSYevgeny Kliteynik if (inner) { 974*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l4_misc, bit_mask, seq_num, misc_3_mask, 975*d65e841dSYevgeny Kliteynik inner_tcp_seq_num); 976*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l4_misc, bit_mask, ack_num, misc_3_mask, 977*d65e841dSYevgeny Kliteynik inner_tcp_ack_num); 978*d65e841dSYevgeny Kliteynik } else { 979*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l4_misc, bit_mask, seq_num, misc_3_mask, 980*d65e841dSYevgeny Kliteynik outer_tcp_seq_num); 981*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(eth_l4_misc, bit_mask, ack_num, misc_3_mask, 982*d65e841dSYevgeny Kliteynik outer_tcp_ack_num); 983*d65e841dSYevgeny Kliteynik } 984*d65e841dSYevgeny Kliteynik } 985*d65e841dSYevgeny Kliteynik 986*d65e841dSYevgeny Kliteynik static int 987*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l4_misc_tag(struct mlx5dr_match_param *value, 988*d65e841dSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 989*d65e841dSYevgeny Kliteynik u8 *tag) 990*d65e841dSYevgeny Kliteynik { 991*d65e841dSYevgeny Kliteynik struct mlx5dr_match_misc3 *misc3 = &value->misc3; 992*d65e841dSYevgeny Kliteynik 993*d65e841dSYevgeny Kliteynik if (sb->inner) { 994*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_misc, tag, seq_num, misc3, inner_tcp_seq_num); 995*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_misc, tag, ack_num, misc3, inner_tcp_ack_num); 996*d65e841dSYevgeny Kliteynik } else { 997*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_misc, tag, seq_num, misc3, outer_tcp_seq_num); 998*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_misc, tag, ack_num, misc3, outer_tcp_ack_num); 999*d65e841dSYevgeny Kliteynik } 1000*d65e841dSYevgeny Kliteynik 1001*d65e841dSYevgeny Kliteynik return 0; 1002*d65e841dSYevgeny Kliteynik } 1003*d65e841dSYevgeny Kliteynik 1004*d65e841dSYevgeny Kliteynik static void 1005*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l4_misc_init(struct mlx5dr_ste_build *sb, 1006*d65e841dSYevgeny Kliteynik struct mlx5dr_match_param *mask) 1007*d65e841dSYevgeny Kliteynik { 1008*d65e841dSYevgeny Kliteynik dr_ste_v0_build_eth_l4_misc_bit_mask(mask, sb->inner, sb->bit_mask); 1009*d65e841dSYevgeny Kliteynik 1010*d65e841dSYevgeny Kliteynik sb->lu_type = DR_STE_CALC_LU_TYPE(ETHL4_MISC, sb->rx, sb->inner); 1011*d65e841dSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 1012*d65e841dSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v0_build_eth_l4_misc_tag; 1013*d65e841dSYevgeny Kliteynik } 1014*d65e841dSYevgeny Kliteynik 1015*d65e841dSYevgeny Kliteynik static void 1016*d65e841dSYevgeny Kliteynik dr_ste_v0_build_flex_parser_tnl_vxlan_gpe_bit_mask(struct mlx5dr_match_param *value, 1017*d65e841dSYevgeny Kliteynik bool inner, u8 *bit_mask) 1018*d65e841dSYevgeny Kliteynik { 1019*d65e841dSYevgeny Kliteynik struct mlx5dr_match_misc3 *misc_3_mask = &value->misc3; 1020*d65e841dSYevgeny Kliteynik 1021*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(flex_parser_tnl_vxlan_gpe, bit_mask, 1022*d65e841dSYevgeny Kliteynik outer_vxlan_gpe_flags, 1023*d65e841dSYevgeny Kliteynik misc_3_mask, outer_vxlan_gpe_flags); 1024*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(flex_parser_tnl_vxlan_gpe, bit_mask, 1025*d65e841dSYevgeny Kliteynik outer_vxlan_gpe_next_protocol, 1026*d65e841dSYevgeny Kliteynik misc_3_mask, outer_vxlan_gpe_next_protocol); 1027*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(flex_parser_tnl_vxlan_gpe, bit_mask, 1028*d65e841dSYevgeny Kliteynik outer_vxlan_gpe_vni, 1029*d65e841dSYevgeny Kliteynik misc_3_mask, outer_vxlan_gpe_vni); 1030*d65e841dSYevgeny Kliteynik } 1031*d65e841dSYevgeny Kliteynik 1032*d65e841dSYevgeny Kliteynik static int 1033*d65e841dSYevgeny Kliteynik dr_ste_v0_build_flex_parser_tnl_vxlan_gpe_tag(struct mlx5dr_match_param *value, 1034*d65e841dSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 1035*d65e841dSYevgeny Kliteynik u8 *tag) 1036*d65e841dSYevgeny Kliteynik { 1037*d65e841dSYevgeny Kliteynik struct mlx5dr_match_misc3 *misc3 = &value->misc3; 1038*d65e841dSYevgeny Kliteynik 1039*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_vxlan_gpe, tag, 1040*d65e841dSYevgeny Kliteynik outer_vxlan_gpe_flags, misc3, 1041*d65e841dSYevgeny Kliteynik outer_vxlan_gpe_flags); 1042*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_vxlan_gpe, tag, 1043*d65e841dSYevgeny Kliteynik outer_vxlan_gpe_next_protocol, misc3, 1044*d65e841dSYevgeny Kliteynik outer_vxlan_gpe_next_protocol); 1045*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_vxlan_gpe, tag, 1046*d65e841dSYevgeny Kliteynik outer_vxlan_gpe_vni, misc3, 1047*d65e841dSYevgeny Kliteynik outer_vxlan_gpe_vni); 1048*d65e841dSYevgeny Kliteynik 1049*d65e841dSYevgeny Kliteynik return 0; 1050*d65e841dSYevgeny Kliteynik } 1051*d65e841dSYevgeny Kliteynik 1052*d65e841dSYevgeny Kliteynik static void 1053*d65e841dSYevgeny Kliteynik dr_ste_v0_build_flex_parser_tnl_vxlan_gpe_init(struct mlx5dr_ste_build *sb, 1054*d65e841dSYevgeny Kliteynik struct mlx5dr_match_param *mask) 1055*d65e841dSYevgeny Kliteynik { 1056*d65e841dSYevgeny Kliteynik dr_ste_v0_build_flex_parser_tnl_vxlan_gpe_bit_mask(mask, sb->inner, 1057*d65e841dSYevgeny Kliteynik sb->bit_mask); 1058*d65e841dSYevgeny Kliteynik sb->lu_type = MLX5DR_STE_LU_TYPE_FLEX_PARSER_TNL_HEADER; 1059*d65e841dSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 1060*d65e841dSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v0_build_flex_parser_tnl_vxlan_gpe_tag; 1061*d65e841dSYevgeny Kliteynik } 1062*d65e841dSYevgeny Kliteynik 1063*d65e841dSYevgeny Kliteynik static void 1064*d65e841dSYevgeny Kliteynik dr_ste_v0_build_flex_parser_tnl_geneve_bit_mask(struct mlx5dr_match_param *value, 1065*d65e841dSYevgeny Kliteynik u8 *bit_mask) 1066*d65e841dSYevgeny Kliteynik { 1067*d65e841dSYevgeny Kliteynik struct mlx5dr_match_misc *misc_mask = &value->misc; 1068*d65e841dSYevgeny Kliteynik 1069*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(flex_parser_tnl_geneve, bit_mask, 1070*d65e841dSYevgeny Kliteynik geneve_protocol_type, 1071*d65e841dSYevgeny Kliteynik misc_mask, geneve_protocol_type); 1072*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(flex_parser_tnl_geneve, bit_mask, 1073*d65e841dSYevgeny Kliteynik geneve_oam, 1074*d65e841dSYevgeny Kliteynik misc_mask, geneve_oam); 1075*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(flex_parser_tnl_geneve, bit_mask, 1076*d65e841dSYevgeny Kliteynik geneve_opt_len, 1077*d65e841dSYevgeny Kliteynik misc_mask, geneve_opt_len); 1078*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(flex_parser_tnl_geneve, bit_mask, 1079*d65e841dSYevgeny Kliteynik geneve_vni, 1080*d65e841dSYevgeny Kliteynik misc_mask, geneve_vni); 1081*d65e841dSYevgeny Kliteynik } 1082*d65e841dSYevgeny Kliteynik 1083*d65e841dSYevgeny Kliteynik static int 1084*d65e841dSYevgeny Kliteynik dr_ste_v0_build_flex_parser_tnl_geneve_tag(struct mlx5dr_match_param *value, 1085*d65e841dSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 1086*d65e841dSYevgeny Kliteynik u8 *tag) 1087*d65e841dSYevgeny Kliteynik { 1088*d65e841dSYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 1089*d65e841dSYevgeny Kliteynik 1090*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_geneve, tag, 1091*d65e841dSYevgeny Kliteynik geneve_protocol_type, misc, geneve_protocol_type); 1092*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_geneve, tag, 1093*d65e841dSYevgeny Kliteynik geneve_oam, misc, geneve_oam); 1094*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_geneve, tag, 1095*d65e841dSYevgeny Kliteynik geneve_opt_len, misc, geneve_opt_len); 1096*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_geneve, tag, 1097*d65e841dSYevgeny Kliteynik geneve_vni, misc, geneve_vni); 1098*d65e841dSYevgeny Kliteynik 1099*d65e841dSYevgeny Kliteynik return 0; 1100*d65e841dSYevgeny Kliteynik } 1101*d65e841dSYevgeny Kliteynik 1102*d65e841dSYevgeny Kliteynik static void 1103*d65e841dSYevgeny Kliteynik dr_ste_v0_build_flex_parser_tnl_geneve_init(struct mlx5dr_ste_build *sb, 1104*d65e841dSYevgeny Kliteynik struct mlx5dr_match_param *mask) 1105*d65e841dSYevgeny Kliteynik { 1106*d65e841dSYevgeny Kliteynik dr_ste_v0_build_flex_parser_tnl_geneve_bit_mask(mask, sb->bit_mask); 1107*d65e841dSYevgeny Kliteynik sb->lu_type = MLX5DR_STE_LU_TYPE_FLEX_PARSER_TNL_HEADER; 1108*d65e841dSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 1109*d65e841dSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v0_build_flex_parser_tnl_geneve_tag; 1110*d65e841dSYevgeny Kliteynik } 1111*d65e841dSYevgeny Kliteynik 1112*d65e841dSYevgeny Kliteynik static void 1113*d65e841dSYevgeny Kliteynik dr_ste_v0_build_register_0_bit_mask(struct mlx5dr_match_param *value, 1114*d65e841dSYevgeny Kliteynik u8 *bit_mask) 1115*d65e841dSYevgeny Kliteynik { 1116*d65e841dSYevgeny Kliteynik struct mlx5dr_match_misc2 *misc_2_mask = &value->misc2; 1117*d65e841dSYevgeny Kliteynik 1118*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(register_0, bit_mask, register_0_h, 1119*d65e841dSYevgeny Kliteynik misc_2_mask, metadata_reg_c_0); 1120*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(register_0, bit_mask, register_0_l, 1121*d65e841dSYevgeny Kliteynik misc_2_mask, metadata_reg_c_1); 1122*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(register_0, bit_mask, register_1_h, 1123*d65e841dSYevgeny Kliteynik misc_2_mask, metadata_reg_c_2); 1124*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(register_0, bit_mask, register_1_l, 1125*d65e841dSYevgeny Kliteynik misc_2_mask, metadata_reg_c_3); 1126*d65e841dSYevgeny Kliteynik } 1127*d65e841dSYevgeny Kliteynik 1128*d65e841dSYevgeny Kliteynik static int 1129*d65e841dSYevgeny Kliteynik dr_ste_v0_build_register_0_tag(struct mlx5dr_match_param *value, 1130*d65e841dSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 1131*d65e841dSYevgeny Kliteynik u8 *tag) 1132*d65e841dSYevgeny Kliteynik { 1133*d65e841dSYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 1134*d65e841dSYevgeny Kliteynik 1135*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(register_0, tag, register_0_h, misc2, metadata_reg_c_0); 1136*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(register_0, tag, register_0_l, misc2, metadata_reg_c_1); 1137*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(register_0, tag, register_1_h, misc2, metadata_reg_c_2); 1138*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(register_0, tag, register_1_l, misc2, metadata_reg_c_3); 1139*d65e841dSYevgeny Kliteynik 1140*d65e841dSYevgeny Kliteynik return 0; 1141*d65e841dSYevgeny Kliteynik } 1142*d65e841dSYevgeny Kliteynik 1143*d65e841dSYevgeny Kliteynik static void 1144*d65e841dSYevgeny Kliteynik dr_ste_v0_build_register_0_init(struct mlx5dr_ste_build *sb, 1145*d65e841dSYevgeny Kliteynik struct mlx5dr_match_param *mask) 1146*d65e841dSYevgeny Kliteynik { 1147*d65e841dSYevgeny Kliteynik dr_ste_v0_build_register_0_bit_mask(mask, sb->bit_mask); 1148*d65e841dSYevgeny Kliteynik 1149*d65e841dSYevgeny Kliteynik sb->lu_type = MLX5DR_STE_LU_TYPE_STEERING_REGISTERS_0; 1150*d65e841dSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 1151*d65e841dSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v0_build_register_0_tag; 1152*d65e841dSYevgeny Kliteynik } 1153*d65e841dSYevgeny Kliteynik 1154*d65e841dSYevgeny Kliteynik static void 1155*d65e841dSYevgeny Kliteynik dr_ste_v0_build_register_1_bit_mask(struct mlx5dr_match_param *value, 1156*d65e841dSYevgeny Kliteynik u8 *bit_mask) 1157*d65e841dSYevgeny Kliteynik { 1158*d65e841dSYevgeny Kliteynik struct mlx5dr_match_misc2 *misc_2_mask = &value->misc2; 1159*d65e841dSYevgeny Kliteynik 1160*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(register_1, bit_mask, register_2_h, 1161*d65e841dSYevgeny Kliteynik misc_2_mask, metadata_reg_c_4); 1162*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(register_1, bit_mask, register_2_l, 1163*d65e841dSYevgeny Kliteynik misc_2_mask, metadata_reg_c_5); 1164*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(register_1, bit_mask, register_3_h, 1165*d65e841dSYevgeny Kliteynik misc_2_mask, metadata_reg_c_6); 1166*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK_V(register_1, bit_mask, register_3_l, 1167*d65e841dSYevgeny Kliteynik misc_2_mask, metadata_reg_c_7); 1168*d65e841dSYevgeny Kliteynik } 1169*d65e841dSYevgeny Kliteynik 1170*d65e841dSYevgeny Kliteynik static int 1171*d65e841dSYevgeny Kliteynik dr_ste_v0_build_register_1_tag(struct mlx5dr_match_param *value, 1172*d65e841dSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 1173*d65e841dSYevgeny Kliteynik u8 *tag) 1174*d65e841dSYevgeny Kliteynik { 1175*d65e841dSYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 1176*d65e841dSYevgeny Kliteynik 1177*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(register_1, tag, register_2_h, misc2, metadata_reg_c_4); 1178*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(register_1, tag, register_2_l, misc2, metadata_reg_c_5); 1179*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(register_1, tag, register_3_h, misc2, metadata_reg_c_6); 1180*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(register_1, tag, register_3_l, misc2, metadata_reg_c_7); 1181*d65e841dSYevgeny Kliteynik 1182*d65e841dSYevgeny Kliteynik return 0; 1183*d65e841dSYevgeny Kliteynik } 1184*d65e841dSYevgeny Kliteynik 1185*d65e841dSYevgeny Kliteynik static void 1186*d65e841dSYevgeny Kliteynik dr_ste_v0_build_register_1_init(struct mlx5dr_ste_build *sb, 1187*d65e841dSYevgeny Kliteynik struct mlx5dr_match_param *mask) 1188*d65e841dSYevgeny Kliteynik { 1189*d65e841dSYevgeny Kliteynik dr_ste_v0_build_register_1_bit_mask(mask, sb->bit_mask); 1190*d65e841dSYevgeny Kliteynik 1191*d65e841dSYevgeny Kliteynik sb->lu_type = MLX5DR_STE_LU_TYPE_STEERING_REGISTERS_1; 1192*d65e841dSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 1193*d65e841dSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v0_build_register_1_tag; 1194*d65e841dSYevgeny Kliteynik } 1195*d65e841dSYevgeny Kliteynik 1196*d65e841dSYevgeny Kliteynik static void 1197*d65e841dSYevgeny Kliteynik dr_ste_v0_build_src_gvmi_qpn_bit_mask(struct mlx5dr_match_param *value, 1198*d65e841dSYevgeny Kliteynik u8 *bit_mask) 1199*d65e841dSYevgeny Kliteynik { 1200*d65e841dSYevgeny Kliteynik struct mlx5dr_match_misc *misc_mask = &value->misc; 1201*d65e841dSYevgeny Kliteynik 1202*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK(src_gvmi_qp, bit_mask, source_gvmi, misc_mask, source_port); 1203*d65e841dSYevgeny Kliteynik DR_STE_SET_MASK(src_gvmi_qp, bit_mask, source_qp, misc_mask, source_sqn); 1204*d65e841dSYevgeny Kliteynik misc_mask->source_eswitch_owner_vhca_id = 0; 1205*d65e841dSYevgeny Kliteynik } 1206*d65e841dSYevgeny Kliteynik 1207*d65e841dSYevgeny Kliteynik static int 1208*d65e841dSYevgeny Kliteynik dr_ste_v0_build_src_gvmi_qpn_tag(struct mlx5dr_match_param *value, 1209*d65e841dSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 1210*d65e841dSYevgeny Kliteynik u8 *tag) 1211*d65e841dSYevgeny Kliteynik { 1212*d65e841dSYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 1213*d65e841dSYevgeny Kliteynik struct mlx5dr_cmd_vport_cap *vport_cap; 1214*d65e841dSYevgeny Kliteynik struct mlx5dr_domain *dmn = sb->dmn; 1215*d65e841dSYevgeny Kliteynik struct mlx5dr_cmd_caps *caps; 1216*d65e841dSYevgeny Kliteynik u8 *bit_mask = sb->bit_mask; 1217*d65e841dSYevgeny Kliteynik bool source_gvmi_set; 1218*d65e841dSYevgeny Kliteynik 1219*d65e841dSYevgeny Kliteynik DR_STE_SET_TAG(src_gvmi_qp, tag, source_qp, misc, source_sqn); 1220*d65e841dSYevgeny Kliteynik 1221*d65e841dSYevgeny Kliteynik if (sb->vhca_id_valid) { 1222*d65e841dSYevgeny Kliteynik /* Find port GVMI based on the eswitch_owner_vhca_id */ 1223*d65e841dSYevgeny Kliteynik if (misc->source_eswitch_owner_vhca_id == dmn->info.caps.gvmi) 1224*d65e841dSYevgeny Kliteynik caps = &dmn->info.caps; 1225*d65e841dSYevgeny Kliteynik else if (dmn->peer_dmn && (misc->source_eswitch_owner_vhca_id == 1226*d65e841dSYevgeny Kliteynik dmn->peer_dmn->info.caps.gvmi)) 1227*d65e841dSYevgeny Kliteynik caps = &dmn->peer_dmn->info.caps; 1228*d65e841dSYevgeny Kliteynik else 1229*d65e841dSYevgeny Kliteynik return -EINVAL; 1230*d65e841dSYevgeny Kliteynik } else { 1231*d65e841dSYevgeny Kliteynik caps = &dmn->info.caps; 1232*d65e841dSYevgeny Kliteynik } 1233*d65e841dSYevgeny Kliteynik 1234*d65e841dSYevgeny Kliteynik vport_cap = mlx5dr_get_vport_cap(caps, misc->source_port); 1235*d65e841dSYevgeny Kliteynik if (!vport_cap) { 1236*d65e841dSYevgeny Kliteynik mlx5dr_err(dmn, "Vport 0x%x is invalid\n", 1237*d65e841dSYevgeny Kliteynik misc->source_port); 1238*d65e841dSYevgeny Kliteynik return -EINVAL; 1239*d65e841dSYevgeny Kliteynik } 1240*d65e841dSYevgeny Kliteynik 1241*d65e841dSYevgeny Kliteynik source_gvmi_set = MLX5_GET(ste_src_gvmi_qp, bit_mask, source_gvmi); 1242*d65e841dSYevgeny Kliteynik if (vport_cap->vport_gvmi && source_gvmi_set) 1243*d65e841dSYevgeny Kliteynik MLX5_SET(ste_src_gvmi_qp, tag, source_gvmi, vport_cap->vport_gvmi); 1244*d65e841dSYevgeny Kliteynik 1245*d65e841dSYevgeny Kliteynik misc->source_eswitch_owner_vhca_id = 0; 1246*d65e841dSYevgeny Kliteynik misc->source_port = 0; 1247*d65e841dSYevgeny Kliteynik 1248*d65e841dSYevgeny Kliteynik return 0; 1249*d65e841dSYevgeny Kliteynik } 1250*d65e841dSYevgeny Kliteynik 1251*d65e841dSYevgeny Kliteynik static void 1252*d65e841dSYevgeny Kliteynik dr_ste_v0_build_src_gvmi_qpn_init(struct mlx5dr_ste_build *sb, 1253*d65e841dSYevgeny Kliteynik struct mlx5dr_match_param *mask) 1254*d65e841dSYevgeny Kliteynik { 1255*d65e841dSYevgeny Kliteynik dr_ste_v0_build_src_gvmi_qpn_bit_mask(mask, sb->bit_mask); 1256*d65e841dSYevgeny Kliteynik 1257*d65e841dSYevgeny Kliteynik sb->lu_type = MLX5DR_STE_LU_TYPE_SRC_GVMI_AND_QP; 1258*d65e841dSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 1259*d65e841dSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v0_build_src_gvmi_qpn_tag; 1260*d65e841dSYevgeny Kliteynik } 1261*d65e841dSYevgeny Kliteynik 1262*d65e841dSYevgeny Kliteynik struct mlx5dr_ste_ctx ste_ctx_v0 = { 1263*d65e841dSYevgeny Kliteynik .build_eth_l2_src_dst_init = &dr_ste_v0_build_eth_l2_src_dst_init, 1264*d65e841dSYevgeny Kliteynik .build_eth_l3_ipv6_src_init = &dr_ste_v0_build_eth_l3_ipv6_src_init, 1265*d65e841dSYevgeny Kliteynik .build_eth_l3_ipv6_dst_init = &dr_ste_v0_build_eth_l3_ipv6_dst_init, 1266*d65e841dSYevgeny Kliteynik .build_eth_l3_ipv4_5_tuple_init = &dr_ste_v0_build_eth_l3_ipv4_5_tuple_init, 1267*d65e841dSYevgeny Kliteynik .build_eth_l2_src_init = &dr_ste_v0_build_eth_l2_src_init, 1268*d65e841dSYevgeny Kliteynik .build_eth_l2_dst_init = &dr_ste_v0_build_eth_l2_dst_init, 1269*d65e841dSYevgeny Kliteynik .build_eth_l2_tnl_init = &dr_ste_v0_build_eth_l2_tnl_init, 1270*d65e841dSYevgeny Kliteynik .build_eth_l3_ipv4_misc_init = &dr_ste_v0_build_eth_l3_ipv4_misc_init, 1271*d65e841dSYevgeny Kliteynik .build_eth_ipv6_l3_l4_init = &dr_ste_v0_build_eth_ipv6_l3_l4_init, 1272*d65e841dSYevgeny Kliteynik .build_mpls_init = &dr_ste_v0_build_mpls_init, 1273*d65e841dSYevgeny Kliteynik .build_tnl_gre_init = &dr_ste_v0_build_tnl_gre_init, 1274*d65e841dSYevgeny Kliteynik .build_tnl_mpls_init = &dr_ste_v0_build_tnl_mpls_init, 1275*d65e841dSYevgeny Kliteynik .build_icmp_init = &dr_ste_v0_build_icmp_init, 1276*d65e841dSYevgeny Kliteynik .build_general_purpose_init = &dr_ste_v0_build_general_purpose_init, 1277*d65e841dSYevgeny Kliteynik .build_eth_l4_misc_init = &dr_ste_v0_build_eth_l4_misc_init, 1278*d65e841dSYevgeny Kliteynik .build_tnl_vxlan_gpe_init = &dr_ste_v0_build_flex_parser_tnl_vxlan_gpe_init, 1279*d65e841dSYevgeny Kliteynik .build_tnl_geneve_init = &dr_ste_v0_build_flex_parser_tnl_geneve_init, 1280*d65e841dSYevgeny Kliteynik .build_register_0_init = &dr_ste_v0_build_register_0_init, 1281*d65e841dSYevgeny Kliteynik .build_register_1_init = &dr_ste_v0_build_register_1_init, 1282*d65e841dSYevgeny Kliteynik .build_src_gvmi_qpn_init = &dr_ste_v0_build_src_gvmi_qpn_init, 1283*d65e841dSYevgeny Kliteynik }; 1284