110b69418SYevgeny Kliteynik // SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB 210b69418SYevgeny Kliteynik /* Copyright (c) 2020 NVIDIA CORPORATION. All rights reserved. */ 310b69418SYevgeny Kliteynik 410b69418SYevgeny Kliteynik #include <linux/types.h> 510b69418SYevgeny Kliteynik #include "mlx5_ifc_dr_ste_v1.h" 610b69418SYevgeny Kliteynik #include "dr_ste.h" 710b69418SYevgeny Kliteynik 810b69418SYevgeny Kliteynik #define DR_STE_CALC_DFNR_TYPE(lookup_type, inner) \ 910b69418SYevgeny Kliteynik ((inner) ? DR_STE_V1_LU_TYPE_##lookup_type##_I : \ 1010b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_##lookup_type##_O) 1110b69418SYevgeny Kliteynik 1210b69418SYevgeny Kliteynik enum dr_ste_v1_entry_format { 1310b69418SYevgeny Kliteynik DR_STE_V1_TYPE_BWC_BYTE = 0x0, 1410b69418SYevgeny Kliteynik DR_STE_V1_TYPE_BWC_DW = 0x1, 1510b69418SYevgeny Kliteynik DR_STE_V1_TYPE_MATCH = 0x2, 1610b69418SYevgeny Kliteynik }; 1710b69418SYevgeny Kliteynik 1810b69418SYevgeny Kliteynik /* Lookup type is built from 2B: [ Definer mode 1B ][ Definer index 1B ] */ 1910b69418SYevgeny Kliteynik enum { 2010b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_NOP = 0x0000, 2110b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_TNL = 0x0002, 2210b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_IBL3_EXT = 0x0102, 2310b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_O = 0x0003, 2410b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_IBL4 = 0x0103, 2510b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_I = 0x0004, 2610b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_SRC_QP_GVMI = 0x0104, 2710b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_SRC_O = 0x0005, 2810b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_HEADERS_O = 0x0105, 2910b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_SRC_I = 0x0006, 3010b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_HEADERS_I = 0x0106, 3110b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL3_IPV4_5_TUPLE_O = 0x0007, 3210b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_IPV6_DES_O = 0x0107, 3310b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL3_IPV4_5_TUPLE_I = 0x0008, 3410b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_IPV6_DES_I = 0x0108, 3510b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL4_O = 0x0009, 3610b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_IPV6_SRC_O = 0x0109, 3710b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL4_I = 0x000a, 3810b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_IPV6_SRC_I = 0x010a, 3910b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_SRC_DST_O = 0x000b, 4010b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_MPLS_O = 0x010b, 4110b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_SRC_DST_I = 0x000c, 4210b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_MPLS_I = 0x010c, 4310b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL3_IPV4_MISC_O = 0x000d, 4410b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_GRE = 0x010d, 4510b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_FLEX_PARSER_TNL_HEADER = 0x000e, 4610b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_GENERAL_PURPOSE = 0x010e, 4710b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL3_IPV4_MISC_I = 0x000f, 4810b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_STEERING_REGISTERS_0 = 0x010f, 4910b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_STEERING_REGISTERS_1 = 0x0110, 5010b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_FLEX_PARSER_0 = 0x0111, 5110b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_FLEX_PARSER_1 = 0x0112, 5210b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL4_MISC_O = 0x0113, 5310b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL4_MISC_I = 0x0114, 5410b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_INVALID = 0x00ff, 5510b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_DONT_CARE = MLX5DR_STE_LU_TYPE_DONT_CARE, 5610b69418SYevgeny Kliteynik }; 5710b69418SYevgeny Kliteynik 58*4e856c5dSYevgeny Kliteynik enum dr_ste_v1_header_anchors { 59*4e856c5dSYevgeny Kliteynik DR_STE_HEADER_ANCHOR_START_OUTER = 0x00, 60*4e856c5dSYevgeny Kliteynik DR_STE_HEADER_ANCHOR_1ST_VLAN = 0x02, 61*4e856c5dSYevgeny Kliteynik DR_STE_HEADER_ANCHOR_IPV6_IPV4 = 0x07, 62*4e856c5dSYevgeny Kliteynik DR_STE_HEADER_ANCHOR_INNER_MAC = 0x13, 63*4e856c5dSYevgeny Kliteynik DR_STE_HEADER_ANCHOR_INNER_IPV6_IPV4 = 0x19, 64*4e856c5dSYevgeny Kliteynik }; 65*4e856c5dSYevgeny Kliteynik 66*4e856c5dSYevgeny Kliteynik enum dr_ste_v1_action_size { 67*4e856c5dSYevgeny Kliteynik DR_STE_ACTION_SINGLE_SZ = 4, 68*4e856c5dSYevgeny Kliteynik DR_STE_ACTION_DOUBLE_SZ = 8, 69*4e856c5dSYevgeny Kliteynik DR_STE_ACTION_TRIPLE_SZ = 12, 70*4e856c5dSYevgeny Kliteynik }; 71*4e856c5dSYevgeny Kliteynik 72*4e856c5dSYevgeny Kliteynik enum dr_ste_v1_action_insert_ptr_attr { 73*4e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_INSERT_PTR_ATTR_NONE = 0, /* Regular push header (e.g. push vlan) */ 74*4e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_INSERT_PTR_ATTR_ENCAP = 1, /* Encapsulation / Tunneling */ 75*4e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_INSERT_PTR_ATTR_ESP = 2, /* IPsec */ 76*4e856c5dSYevgeny Kliteynik }; 77*4e856c5dSYevgeny Kliteynik 78*4e856c5dSYevgeny Kliteynik enum dr_ste_v1_action_id { 79*4e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_NOP = 0x00, 80*4e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_COPY = 0x05, 81*4e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_SET = 0x06, 82*4e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_ADD = 0x07, 83*4e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_REMOVE_BY_SIZE = 0x08, 84*4e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_REMOVE_HEADER_TO_HEADER = 0x09, 85*4e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_INSERT_INLINE = 0x0a, 86*4e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_INSERT_POINTER = 0x0b, 87*4e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_FLOW_TAG = 0x0c, 88*4e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_QUEUE_ID_SEL = 0x0d, 89*4e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_ACCELERATED_LIST = 0x0e, 90*4e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_MODIFY_LIST = 0x0f, 91*4e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_TRAILER = 0x13, 92*4e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_COUNTER_ID = 0x14, 93*4e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_MAX = 0x21, 94*4e856c5dSYevgeny Kliteynik /* use for special cases */ 95*4e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_SPECIAL_ENCAP_L3 = 0x22, 96*4e856c5dSYevgeny Kliteynik }; 97*4e856c5dSYevgeny Kliteynik 98*4e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_entry_type(u8 *hw_ste_p, u8 entry_type) 99*4e856c5dSYevgeny Kliteynik { 100*4e856c5dSYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, entry_format, entry_type); 101*4e856c5dSYevgeny Kliteynik } 102*4e856c5dSYevgeny Kliteynik 103a6098129SYevgeny Kliteynik static void dr_ste_v1_set_miss_addr(u8 *hw_ste_p, u64 miss_addr) 104a6098129SYevgeny Kliteynik { 105a6098129SYevgeny Kliteynik u64 index = miss_addr >> 6; 106a6098129SYevgeny Kliteynik 107a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, miss_address_39_32, index >> 26); 108a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, miss_address_31_6, index); 109a6098129SYevgeny Kliteynik } 110a6098129SYevgeny Kliteynik 111a6098129SYevgeny Kliteynik static u64 dr_ste_v1_get_miss_addr(u8 *hw_ste_p) 112a6098129SYevgeny Kliteynik { 113a6098129SYevgeny Kliteynik u64 index = 114a6098129SYevgeny Kliteynik (MLX5_GET(ste_match_bwc_v1, hw_ste_p, miss_address_31_6) | 115a6098129SYevgeny Kliteynik MLX5_GET(ste_match_bwc_v1, hw_ste_p, miss_address_39_32) << 26); 116a6098129SYevgeny Kliteynik 117a6098129SYevgeny Kliteynik return index << 6; 118a6098129SYevgeny Kliteynik } 119a6098129SYevgeny Kliteynik 120a6098129SYevgeny Kliteynik static void dr_ste_v1_set_byte_mask(u8 *hw_ste_p, u16 byte_mask) 121a6098129SYevgeny Kliteynik { 122a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, byte_mask, byte_mask); 123a6098129SYevgeny Kliteynik } 124a6098129SYevgeny Kliteynik 125a6098129SYevgeny Kliteynik static u16 dr_ste_v1_get_byte_mask(u8 *hw_ste_p) 126a6098129SYevgeny Kliteynik { 127a6098129SYevgeny Kliteynik return MLX5_GET(ste_match_bwc_v1, hw_ste_p, byte_mask); 128a6098129SYevgeny Kliteynik } 129a6098129SYevgeny Kliteynik 130a6098129SYevgeny Kliteynik static void dr_ste_v1_set_lu_type(u8 *hw_ste_p, u16 lu_type) 131a6098129SYevgeny Kliteynik { 132a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, entry_format, lu_type >> 8); 133a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, match_definer_ctx_idx, lu_type & 0xFF); 134a6098129SYevgeny Kliteynik } 135a6098129SYevgeny Kliteynik 136a6098129SYevgeny Kliteynik static void dr_ste_v1_set_next_lu_type(u8 *hw_ste_p, u16 lu_type) 137a6098129SYevgeny Kliteynik { 138a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, next_entry_format, lu_type >> 8); 139a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, hash_definer_ctx_idx, lu_type & 0xFF); 140a6098129SYevgeny Kliteynik } 141a6098129SYevgeny Kliteynik 142a6098129SYevgeny Kliteynik static u16 dr_ste_v1_get_next_lu_type(u8 *hw_ste_p) 143a6098129SYevgeny Kliteynik { 144a6098129SYevgeny Kliteynik u8 mode = MLX5_GET(ste_match_bwc_v1, hw_ste_p, next_entry_format); 145a6098129SYevgeny Kliteynik u8 index = MLX5_GET(ste_match_bwc_v1, hw_ste_p, hash_definer_ctx_idx); 146a6098129SYevgeny Kliteynik 147a6098129SYevgeny Kliteynik return (mode << 8 | index); 148a6098129SYevgeny Kliteynik } 149a6098129SYevgeny Kliteynik 150*4e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_hit_gvmi(u8 *hw_ste_p, u16 gvmi) 151*4e856c5dSYevgeny Kliteynik { 152*4e856c5dSYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, next_table_base_63_48, gvmi); 153*4e856c5dSYevgeny Kliteynik } 154*4e856c5dSYevgeny Kliteynik 155a6098129SYevgeny Kliteynik static void dr_ste_v1_set_hit_addr(u8 *hw_ste_p, u64 icm_addr, u32 ht_size) 156a6098129SYevgeny Kliteynik { 157a6098129SYevgeny Kliteynik u64 index = (icm_addr >> 5) | ht_size; 158a6098129SYevgeny Kliteynik 159a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, next_table_base_39_32_size, index >> 27); 160a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, next_table_base_31_5_size, index); 161a6098129SYevgeny Kliteynik } 162a6098129SYevgeny Kliteynik 163a6098129SYevgeny Kliteynik static void dr_ste_v1_init(u8 *hw_ste_p, u16 lu_type, 164a6098129SYevgeny Kliteynik u8 entry_type, u16 gvmi) 165a6098129SYevgeny Kliteynik { 166a6098129SYevgeny Kliteynik dr_ste_v1_set_lu_type(hw_ste_p, lu_type); 167a6098129SYevgeny Kliteynik dr_ste_v1_set_next_lu_type(hw_ste_p, MLX5DR_STE_LU_TYPE_DONT_CARE); 168a6098129SYevgeny Kliteynik 169a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, gvmi, gvmi); 170a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, next_table_base_63_48, gvmi); 171a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, miss_address_63_48, gvmi); 172a6098129SYevgeny Kliteynik } 173a6098129SYevgeny Kliteynik 174*4e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_rx_flow_tag(u8 *s_action, u32 flow_tag) 175*4e856c5dSYevgeny Kliteynik { 176*4e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_flow_tag_v1, s_action, action_id, 177*4e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_FLOW_TAG); 178*4e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_flow_tag_v1, s_action, flow_tag, flow_tag); 179*4e856c5dSYevgeny Kliteynik } 180*4e856c5dSYevgeny Kliteynik 181*4e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_counter_id(u8 *hw_ste_p, u32 ctr_id) 182*4e856c5dSYevgeny Kliteynik { 183*4e856c5dSYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, counter_id, ctr_id); 184*4e856c5dSYevgeny Kliteynik } 185*4e856c5dSYevgeny Kliteynik 186*4e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_reparse(u8 *hw_ste_p) 187*4e856c5dSYevgeny Kliteynik { 188*4e856c5dSYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, reparse, 1); 189*4e856c5dSYevgeny Kliteynik } 190*4e856c5dSYevgeny Kliteynik 191*4e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_tx_encap(u8 *hw_ste_p, u8 *d_action, 192*4e856c5dSYevgeny Kliteynik u32 reformat_id, int size) 193*4e856c5dSYevgeny Kliteynik { 194*4e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, action_id, 195*4e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_INSERT_POINTER); 196*4e856c5dSYevgeny Kliteynik /* The hardware expects here size in words (2 byte) */ 197*4e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, size, size / 2); 198*4e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, pointer, reformat_id); 199*4e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, attributes, 200*4e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_INSERT_PTR_ATTR_ENCAP); 201*4e856c5dSYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 202*4e856c5dSYevgeny Kliteynik } 203*4e856c5dSYevgeny Kliteynik 204*4e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_tx_push_vlan(u8 *hw_ste_p, u8 *d_action, 205*4e856c5dSYevgeny Kliteynik u32 vlan_hdr) 206*4e856c5dSYevgeny Kliteynik { 207*4e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_inline_v1, d_action, 208*4e856c5dSYevgeny Kliteynik action_id, DR_STE_V1_ACTION_ID_INSERT_INLINE); 209*4e856c5dSYevgeny Kliteynik /* The hardware expects offset to vlan header in words (2 byte) */ 210*4e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_inline_v1, d_action, 211*4e856c5dSYevgeny Kliteynik start_offset, HDR_LEN_L2_MACS >> 1); 212*4e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_inline_v1, d_action, 213*4e856c5dSYevgeny Kliteynik inline_data, vlan_hdr); 214*4e856c5dSYevgeny Kliteynik 215*4e856c5dSYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 216*4e856c5dSYevgeny Kliteynik } 217*4e856c5dSYevgeny Kliteynik 218*4e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_rx_pop_vlan(u8 *hw_ste_p, u8 *s_action, u8 vlans_num) 219*4e856c5dSYevgeny Kliteynik { 220*4e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_size_v1, s_action, 221*4e856c5dSYevgeny Kliteynik action_id, DR_STE_V1_ACTION_ID_REMOVE_BY_SIZE); 222*4e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_size_v1, s_action, 223*4e856c5dSYevgeny Kliteynik start_anchor, DR_STE_HEADER_ANCHOR_1ST_VLAN); 224*4e856c5dSYevgeny Kliteynik /* The hardware expects here size in words (2 byte) */ 225*4e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_size_v1, s_action, 226*4e856c5dSYevgeny Kliteynik remove_size, (HDR_LEN_L2_VLAN >> 1) * vlans_num); 227*4e856c5dSYevgeny Kliteynik 228*4e856c5dSYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 229*4e856c5dSYevgeny Kliteynik } 230*4e856c5dSYevgeny Kliteynik 231*4e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_tx_encap_l3(u8 *hw_ste_p, 232*4e856c5dSYevgeny Kliteynik u8 *frst_s_action, 233*4e856c5dSYevgeny Kliteynik u8 *scnd_d_action, 234*4e856c5dSYevgeny Kliteynik u32 reformat_id, 235*4e856c5dSYevgeny Kliteynik int size) 236*4e856c5dSYevgeny Kliteynik { 237*4e856c5dSYevgeny Kliteynik /* Remove L2 headers */ 238*4e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, frst_s_action, action_id, 239*4e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_REMOVE_HEADER_TO_HEADER); 240*4e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, frst_s_action, end_anchor, 241*4e856c5dSYevgeny Kliteynik DR_STE_HEADER_ANCHOR_IPV6_IPV4); 242*4e856c5dSYevgeny Kliteynik 243*4e856c5dSYevgeny Kliteynik /* Encapsulate with given reformat ID */ 244*4e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, scnd_d_action, action_id, 245*4e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_INSERT_POINTER); 246*4e856c5dSYevgeny Kliteynik /* The hardware expects here size in words (2 byte) */ 247*4e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, scnd_d_action, size, size / 2); 248*4e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, scnd_d_action, pointer, reformat_id); 249*4e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, scnd_d_action, attributes, 250*4e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_INSERT_PTR_ATTR_ENCAP); 251*4e856c5dSYevgeny Kliteynik 252*4e856c5dSYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 253*4e856c5dSYevgeny Kliteynik } 254*4e856c5dSYevgeny Kliteynik 255*4e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_rx_decap(u8 *hw_ste_p, u8 *s_action) 256*4e856c5dSYevgeny Kliteynik { 257*4e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, s_action, action_id, 258*4e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_REMOVE_HEADER_TO_HEADER); 259*4e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, s_action, decap, 1); 260*4e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, s_action, vni_to_cqe, 1); 261*4e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, s_action, end_anchor, 262*4e856c5dSYevgeny Kliteynik DR_STE_HEADER_ANCHOR_INNER_MAC); 263*4e856c5dSYevgeny Kliteynik 264*4e856c5dSYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 265*4e856c5dSYevgeny Kliteynik } 266*4e856c5dSYevgeny Kliteynik 267*4e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_rx_decap_l3(u8 *hw_ste_p, 268*4e856c5dSYevgeny Kliteynik u8 *s_action, 269*4e856c5dSYevgeny Kliteynik u16 decap_actions, 270*4e856c5dSYevgeny Kliteynik u32 decap_index) 271*4e856c5dSYevgeny Kliteynik { 272*4e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_modify_list_v1, s_action, action_id, 273*4e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_MODIFY_LIST); 274*4e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_modify_list_v1, s_action, num_of_modify_actions, 275*4e856c5dSYevgeny Kliteynik decap_actions); 276*4e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_modify_list_v1, s_action, modify_actions_ptr, 277*4e856c5dSYevgeny Kliteynik decap_index); 278*4e856c5dSYevgeny Kliteynik 279*4e856c5dSYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 280*4e856c5dSYevgeny Kliteynik } 281*4e856c5dSYevgeny Kliteynik 282*4e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_rewrite_actions(u8 *hw_ste_p, 283*4e856c5dSYevgeny Kliteynik u8 *s_action, 284*4e856c5dSYevgeny Kliteynik u16 num_of_actions, 285*4e856c5dSYevgeny Kliteynik u32 re_write_index) 286*4e856c5dSYevgeny Kliteynik { 287*4e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_modify_list_v1, s_action, action_id, 288*4e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_MODIFY_LIST); 289*4e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_modify_list_v1, s_action, num_of_modify_actions, 290*4e856c5dSYevgeny Kliteynik num_of_actions); 291*4e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_modify_list_v1, s_action, modify_actions_ptr, 292*4e856c5dSYevgeny Kliteynik re_write_index); 293*4e856c5dSYevgeny Kliteynik 294*4e856c5dSYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 295*4e856c5dSYevgeny Kliteynik } 296*4e856c5dSYevgeny Kliteynik 297*4e856c5dSYevgeny Kliteynik static void dr_ste_v1_arr_init_next_match(u8 **last_ste, 298*4e856c5dSYevgeny Kliteynik u32 *added_stes, 299*4e856c5dSYevgeny Kliteynik u16 gvmi) 300*4e856c5dSYevgeny Kliteynik { 301*4e856c5dSYevgeny Kliteynik u8 *action; 302*4e856c5dSYevgeny Kliteynik 303*4e856c5dSYevgeny Kliteynik (*added_stes)++; 304*4e856c5dSYevgeny Kliteynik *last_ste += DR_STE_SIZE; 305*4e856c5dSYevgeny Kliteynik dr_ste_v1_init(*last_ste, MLX5DR_STE_LU_TYPE_DONT_CARE, 0, gvmi); 306*4e856c5dSYevgeny Kliteynik dr_ste_v1_set_entry_type(*last_ste, DR_STE_V1_TYPE_MATCH); 307*4e856c5dSYevgeny Kliteynik 308*4e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, *last_ste, action); 309*4e856c5dSYevgeny Kliteynik memset(action, 0, MLX5_FLD_SZ_BYTES(ste_mask_and_match_v1, action)); 310*4e856c5dSYevgeny Kliteynik } 311*4e856c5dSYevgeny Kliteynik 312*4e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_actions_tx(struct mlx5dr_domain *dmn, 313*4e856c5dSYevgeny Kliteynik u8 *action_type_set, 314*4e856c5dSYevgeny Kliteynik u8 *last_ste, 315*4e856c5dSYevgeny Kliteynik struct mlx5dr_ste_actions_attr *attr, 316*4e856c5dSYevgeny Kliteynik u32 *added_stes) 317*4e856c5dSYevgeny Kliteynik { 318*4e856c5dSYevgeny Kliteynik u8 *action = MLX5_ADDR_OF(ste_match_bwc_v1, last_ste, action); 319*4e856c5dSYevgeny Kliteynik u8 action_sz = DR_STE_ACTION_DOUBLE_SZ; 320*4e856c5dSYevgeny Kliteynik bool allow_encap = true; 321*4e856c5dSYevgeny Kliteynik 322*4e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_CTR]) 323*4e856c5dSYevgeny Kliteynik dr_ste_v1_set_counter_id(last_ste, attr->ctr_id); 324*4e856c5dSYevgeny Kliteynik 325*4e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_MODIFY_HDR]) { 326*4e856c5dSYevgeny Kliteynik if (action_sz < DR_STE_ACTION_DOUBLE_SZ) { 327*4e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, 328*4e856c5dSYevgeny Kliteynik attr->gvmi); 329*4e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, 330*4e856c5dSYevgeny Kliteynik last_ste, action); 331*4e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 332*4e856c5dSYevgeny Kliteynik } 333*4e856c5dSYevgeny Kliteynik dr_ste_v1_set_rewrite_actions(last_ste, action, 334*4e856c5dSYevgeny Kliteynik attr->modify_actions, 335*4e856c5dSYevgeny Kliteynik attr->modify_index); 336*4e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 337*4e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 338*4e856c5dSYevgeny Kliteynik allow_encap = false; 339*4e856c5dSYevgeny Kliteynik } 340*4e856c5dSYevgeny Kliteynik 341*4e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_PUSH_VLAN]) { 342*4e856c5dSYevgeny Kliteynik int i; 343*4e856c5dSYevgeny Kliteynik 344*4e856c5dSYevgeny Kliteynik for (i = 0; i < attr->vlans.count; i++) { 345*4e856c5dSYevgeny Kliteynik if (action_sz < DR_STE_ACTION_DOUBLE_SZ || !allow_encap) { 346*4e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 347*4e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 348*4e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 349*4e856c5dSYevgeny Kliteynik allow_encap = true; 350*4e856c5dSYevgeny Kliteynik } 351*4e856c5dSYevgeny Kliteynik dr_ste_v1_set_tx_push_vlan(last_ste, action, attr->vlans.headers[i]); 352*4e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 353*4e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 354*4e856c5dSYevgeny Kliteynik } 355*4e856c5dSYevgeny Kliteynik } 356*4e856c5dSYevgeny Kliteynik 357*4e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_L2_TO_TNL_L2]) { 358*4e856c5dSYevgeny Kliteynik if (!allow_encap || action_sz < DR_STE_ACTION_DOUBLE_SZ) { 359*4e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 360*4e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 361*4e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 362*4e856c5dSYevgeny Kliteynik allow_encap = true; 363*4e856c5dSYevgeny Kliteynik } 364*4e856c5dSYevgeny Kliteynik dr_ste_v1_set_tx_encap(last_ste, action, 365*4e856c5dSYevgeny Kliteynik attr->reformat_id, 366*4e856c5dSYevgeny Kliteynik attr->reformat_size); 367*4e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 368*4e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 369*4e856c5dSYevgeny Kliteynik } else if (action_type_set[DR_ACTION_TYP_L2_TO_TNL_L3]) { 370*4e856c5dSYevgeny Kliteynik u8 *d_action; 371*4e856c5dSYevgeny Kliteynik 372*4e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 373*4e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 374*4e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 375*4e856c5dSYevgeny Kliteynik d_action = action + DR_STE_ACTION_SINGLE_SZ; 376*4e856c5dSYevgeny Kliteynik 377*4e856c5dSYevgeny Kliteynik dr_ste_v1_set_tx_encap_l3(last_ste, 378*4e856c5dSYevgeny Kliteynik action, d_action, 379*4e856c5dSYevgeny Kliteynik attr->reformat_id, 380*4e856c5dSYevgeny Kliteynik attr->reformat_size); 381*4e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_TRIPLE_SZ; 382*4e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_TRIPLE_SZ; 383*4e856c5dSYevgeny Kliteynik } 384*4e856c5dSYevgeny Kliteynik 385*4e856c5dSYevgeny Kliteynik dr_ste_v1_set_hit_gvmi(last_ste, attr->hit_gvmi); 386*4e856c5dSYevgeny Kliteynik dr_ste_v1_set_hit_addr(last_ste, attr->final_icm_addr, 1); 387*4e856c5dSYevgeny Kliteynik } 388*4e856c5dSYevgeny Kliteynik 389*4e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_actions_rx(struct mlx5dr_domain *dmn, 390*4e856c5dSYevgeny Kliteynik u8 *action_type_set, 391*4e856c5dSYevgeny Kliteynik u8 *last_ste, 392*4e856c5dSYevgeny Kliteynik struct mlx5dr_ste_actions_attr *attr, 393*4e856c5dSYevgeny Kliteynik u32 *added_stes) 394*4e856c5dSYevgeny Kliteynik { 395*4e856c5dSYevgeny Kliteynik u8 *action = MLX5_ADDR_OF(ste_match_bwc_v1, last_ste, action); 396*4e856c5dSYevgeny Kliteynik u8 action_sz = DR_STE_ACTION_DOUBLE_SZ; 397*4e856c5dSYevgeny Kliteynik bool allow_modify_hdr = true; 398*4e856c5dSYevgeny Kliteynik bool allow_ctr = true; 399*4e856c5dSYevgeny Kliteynik 400*4e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_TNL_L3_TO_L2]) { 401*4e856c5dSYevgeny Kliteynik dr_ste_v1_set_rx_decap_l3(last_ste, action, 402*4e856c5dSYevgeny Kliteynik attr->decap_actions, 403*4e856c5dSYevgeny Kliteynik attr->decap_index); 404*4e856c5dSYevgeny Kliteynik dr_ste_v1_set_rewrite_actions(last_ste, action, 405*4e856c5dSYevgeny Kliteynik attr->decap_actions, 406*4e856c5dSYevgeny Kliteynik attr->decap_index); 407*4e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 408*4e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 409*4e856c5dSYevgeny Kliteynik allow_modify_hdr = false; 410*4e856c5dSYevgeny Kliteynik allow_ctr = false; 411*4e856c5dSYevgeny Kliteynik } else if (action_type_set[DR_ACTION_TYP_TNL_L2_TO_L2]) { 412*4e856c5dSYevgeny Kliteynik dr_ste_v1_set_rx_decap(last_ste, action); 413*4e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_SINGLE_SZ; 414*4e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_SINGLE_SZ; 415*4e856c5dSYevgeny Kliteynik allow_modify_hdr = false; 416*4e856c5dSYevgeny Kliteynik allow_ctr = false; 417*4e856c5dSYevgeny Kliteynik } 418*4e856c5dSYevgeny Kliteynik 419*4e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_TAG]) { 420*4e856c5dSYevgeny Kliteynik if (action_sz < DR_STE_ACTION_SINGLE_SZ) { 421*4e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 422*4e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 423*4e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 424*4e856c5dSYevgeny Kliteynik allow_modify_hdr = true; 425*4e856c5dSYevgeny Kliteynik allow_ctr = true; 426*4e856c5dSYevgeny Kliteynik } 427*4e856c5dSYevgeny Kliteynik dr_ste_v1_set_rx_flow_tag(action, attr->flow_tag); 428*4e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_SINGLE_SZ; 429*4e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_SINGLE_SZ; 430*4e856c5dSYevgeny Kliteynik } 431*4e856c5dSYevgeny Kliteynik 432*4e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_POP_VLAN]) { 433*4e856c5dSYevgeny Kliteynik if (action_sz < DR_STE_ACTION_SINGLE_SZ || 434*4e856c5dSYevgeny Kliteynik !allow_modify_hdr) { 435*4e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 436*4e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 437*4e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 438*4e856c5dSYevgeny Kliteynik allow_modify_hdr = false; 439*4e856c5dSYevgeny Kliteynik allow_ctr = false; 440*4e856c5dSYevgeny Kliteynik } 441*4e856c5dSYevgeny Kliteynik 442*4e856c5dSYevgeny Kliteynik dr_ste_v1_set_rx_pop_vlan(last_ste, action, attr->vlans.count); 443*4e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_SINGLE_SZ; 444*4e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_SINGLE_SZ; 445*4e856c5dSYevgeny Kliteynik } 446*4e856c5dSYevgeny Kliteynik 447*4e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_MODIFY_HDR]) { 448*4e856c5dSYevgeny Kliteynik /* Modify header and decapsulation must use different STEs */ 449*4e856c5dSYevgeny Kliteynik if (!allow_modify_hdr || action_sz < DR_STE_ACTION_DOUBLE_SZ) { 450*4e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 451*4e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 452*4e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 453*4e856c5dSYevgeny Kliteynik allow_modify_hdr = true; 454*4e856c5dSYevgeny Kliteynik allow_ctr = true; 455*4e856c5dSYevgeny Kliteynik } 456*4e856c5dSYevgeny Kliteynik dr_ste_v1_set_rewrite_actions(last_ste, action, 457*4e856c5dSYevgeny Kliteynik attr->modify_actions, 458*4e856c5dSYevgeny Kliteynik attr->modify_index); 459*4e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 460*4e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 461*4e856c5dSYevgeny Kliteynik } 462*4e856c5dSYevgeny Kliteynik 463*4e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_CTR]) { 464*4e856c5dSYevgeny Kliteynik /* Counter action set after decap to exclude decaped header */ 465*4e856c5dSYevgeny Kliteynik if (!allow_ctr) { 466*4e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 467*4e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 468*4e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 469*4e856c5dSYevgeny Kliteynik allow_modify_hdr = true; 470*4e856c5dSYevgeny Kliteynik allow_ctr = false; 471*4e856c5dSYevgeny Kliteynik } 472*4e856c5dSYevgeny Kliteynik dr_ste_v1_set_counter_id(last_ste, attr->ctr_id); 473*4e856c5dSYevgeny Kliteynik } 474*4e856c5dSYevgeny Kliteynik 475*4e856c5dSYevgeny Kliteynik dr_ste_v1_set_hit_gvmi(last_ste, attr->hit_gvmi); 476*4e856c5dSYevgeny Kliteynik dr_ste_v1_set_hit_addr(last_ste, attr->final_icm_addr, 1); 477*4e856c5dSYevgeny Kliteynik } 478*4e856c5dSYevgeny Kliteynik 47910b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_src_dst_bit_mask(struct mlx5dr_match_param *value, 48010b69418SYevgeny Kliteynik bool inner, u8 *bit_mask) 48110b69418SYevgeny Kliteynik { 48210b69418SYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 48310b69418SYevgeny Kliteynik 48410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, dmac_47_16, mask, dmac_47_16); 48510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, dmac_15_0, mask, dmac_15_0); 48610b69418SYevgeny Kliteynik 48710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, smac_47_16, mask, smac_47_16); 48810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, smac_15_0, mask, smac_15_0); 48910b69418SYevgeny Kliteynik 49010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, first_vlan_id, mask, first_vid); 49110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, first_cfi, mask, first_cfi); 49210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, first_priority, mask, first_prio); 49310b69418SYevgeny Kliteynik DR_STE_SET_ONES(eth_l2_src_dst_v1, bit_mask, l3_type, mask, ip_version); 49410b69418SYevgeny Kliteynik 49510b69418SYevgeny Kliteynik if (mask->cvlan_tag) { 49610b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, bit_mask, first_vlan_qualifier, -1); 49710b69418SYevgeny Kliteynik mask->cvlan_tag = 0; 49810b69418SYevgeny Kliteynik } else if (mask->svlan_tag) { 49910b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, bit_mask, first_vlan_qualifier, -1); 50010b69418SYevgeny Kliteynik mask->svlan_tag = 0; 50110b69418SYevgeny Kliteynik } 50210b69418SYevgeny Kliteynik } 50310b69418SYevgeny Kliteynik 50410b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l2_src_dst_tag(struct mlx5dr_match_param *value, 50510b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 50610b69418SYevgeny Kliteynik u8 *tag) 50710b69418SYevgeny Kliteynik { 50810b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 50910b69418SYevgeny Kliteynik 51010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, dmac_47_16, spec, dmac_47_16); 51110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, dmac_15_0, spec, dmac_15_0); 51210b69418SYevgeny Kliteynik 51310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, smac_47_16, spec, smac_47_16); 51410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, smac_15_0, spec, smac_15_0); 51510b69418SYevgeny Kliteynik 51610b69418SYevgeny Kliteynik if (spec->ip_version == IP_VERSION_IPV4) { 51710b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, tag, l3_type, STE_IPV4); 51810b69418SYevgeny Kliteynik spec->ip_version = 0; 51910b69418SYevgeny Kliteynik } else if (spec->ip_version == IP_VERSION_IPV6) { 52010b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, tag, l3_type, STE_IPV6); 52110b69418SYevgeny Kliteynik spec->ip_version = 0; 52210b69418SYevgeny Kliteynik } else if (spec->ip_version) { 52310b69418SYevgeny Kliteynik return -EINVAL; 52410b69418SYevgeny Kliteynik } 52510b69418SYevgeny Kliteynik 52610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, first_vlan_id, spec, first_vid); 52710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, first_cfi, spec, first_cfi); 52810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, first_priority, spec, first_prio); 52910b69418SYevgeny Kliteynik 53010b69418SYevgeny Kliteynik if (spec->cvlan_tag) { 53110b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, tag, first_vlan_qualifier, DR_STE_CVLAN); 53210b69418SYevgeny Kliteynik spec->cvlan_tag = 0; 53310b69418SYevgeny Kliteynik } else if (spec->svlan_tag) { 53410b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, tag, first_vlan_qualifier, DR_STE_SVLAN); 53510b69418SYevgeny Kliteynik spec->svlan_tag = 0; 53610b69418SYevgeny Kliteynik } 53710b69418SYevgeny Kliteynik return 0; 53810b69418SYevgeny Kliteynik } 53910b69418SYevgeny Kliteynik 54010b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_src_dst_init(struct mlx5dr_ste_build *sb, 54110b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 54210b69418SYevgeny Kliteynik { 54310b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_src_dst_bit_mask(mask, sb->inner, sb->bit_mask); 54410b69418SYevgeny Kliteynik 54510b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL2_SRC_DST, sb->inner); 54610b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 54710b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l2_src_dst_tag; 54810b69418SYevgeny Kliteynik } 54910b69418SYevgeny Kliteynik 55010b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l3_ipv6_dst_tag(struct mlx5dr_match_param *value, 55110b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 55210b69418SYevgeny Kliteynik u8 *tag) 55310b69418SYevgeny Kliteynik { 55410b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 55510b69418SYevgeny Kliteynik 55610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_dst, tag, dst_ip_127_96, spec, dst_ip_127_96); 55710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_dst, tag, dst_ip_95_64, spec, dst_ip_95_64); 55810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_dst, tag, dst_ip_63_32, spec, dst_ip_63_32); 55910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_dst, tag, dst_ip_31_0, spec, dst_ip_31_0); 56010b69418SYevgeny Kliteynik 56110b69418SYevgeny Kliteynik return 0; 56210b69418SYevgeny Kliteynik } 56310b69418SYevgeny Kliteynik 56410b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l3_ipv6_dst_init(struct mlx5dr_ste_build *sb, 56510b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 56610b69418SYevgeny Kliteynik { 56710b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l3_ipv6_dst_tag(mask, sb, sb->bit_mask); 56810b69418SYevgeny Kliteynik 56910b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(IPV6_DES, sb->inner); 57010b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 57110b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l3_ipv6_dst_tag; 57210b69418SYevgeny Kliteynik } 57310b69418SYevgeny Kliteynik 57410b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l3_ipv6_src_tag(struct mlx5dr_match_param *value, 57510b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 57610b69418SYevgeny Kliteynik u8 *tag) 57710b69418SYevgeny Kliteynik { 57810b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 57910b69418SYevgeny Kliteynik 58010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_src, tag, src_ip_127_96, spec, src_ip_127_96); 58110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_src, tag, src_ip_95_64, spec, src_ip_95_64); 58210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_src, tag, src_ip_63_32, spec, src_ip_63_32); 58310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_src, tag, src_ip_31_0, spec, src_ip_31_0); 58410b69418SYevgeny Kliteynik 58510b69418SYevgeny Kliteynik return 0; 58610b69418SYevgeny Kliteynik } 58710b69418SYevgeny Kliteynik 58810b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l3_ipv6_src_init(struct mlx5dr_ste_build *sb, 58910b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 59010b69418SYevgeny Kliteynik { 59110b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l3_ipv6_src_tag(mask, sb, sb->bit_mask); 59210b69418SYevgeny Kliteynik 59310b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(IPV6_SRC, sb->inner); 59410b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 59510b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l3_ipv6_src_tag; 59610b69418SYevgeny Kliteynik } 59710b69418SYevgeny Kliteynik 59810b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l3_ipv4_5_tuple_tag(struct mlx5dr_match_param *value, 59910b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 60010b69418SYevgeny Kliteynik u8 *tag) 60110b69418SYevgeny Kliteynik { 60210b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 60310b69418SYevgeny Kliteynik 60410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, destination_address, spec, dst_ip_31_0); 60510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, source_address, spec, src_ip_31_0); 60610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, destination_port, spec, tcp_dport); 60710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, destination_port, spec, udp_dport); 60810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, source_port, spec, tcp_sport); 60910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, source_port, spec, udp_sport); 61010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, protocol, spec, ip_protocol); 61110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, fragmented, spec, frag); 61210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, dscp, spec, ip_dscp); 61310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, ecn, spec, ip_ecn); 61410b69418SYevgeny Kliteynik 61510b69418SYevgeny Kliteynik if (spec->tcp_flags) { 61610b69418SYevgeny Kliteynik DR_STE_SET_TCP_FLAGS(eth_l3_ipv4_5_tuple_v1, tag, spec); 61710b69418SYevgeny Kliteynik spec->tcp_flags = 0; 61810b69418SYevgeny Kliteynik } 61910b69418SYevgeny Kliteynik 62010b69418SYevgeny Kliteynik return 0; 62110b69418SYevgeny Kliteynik } 62210b69418SYevgeny Kliteynik 62310b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l3_ipv4_5_tuple_init(struct mlx5dr_ste_build *sb, 62410b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 62510b69418SYevgeny Kliteynik { 62610b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l3_ipv4_5_tuple_tag(mask, sb, sb->bit_mask); 62710b69418SYevgeny Kliteynik 62810b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL3_IPV4_5_TUPLE, sb->inner); 62910b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 63010b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l3_ipv4_5_tuple_tag; 63110b69418SYevgeny Kliteynik } 63210b69418SYevgeny Kliteynik 63310b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_src_or_dst_bit_mask(struct mlx5dr_match_param *value, 63410b69418SYevgeny Kliteynik bool inner, u8 *bit_mask) 63510b69418SYevgeny Kliteynik { 63610b69418SYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 63710b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc_mask = &value->misc; 63810b69418SYevgeny Kliteynik 63910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, first_vlan_id, mask, first_vid); 64010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, first_cfi, mask, first_cfi); 64110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, first_priority, mask, first_prio); 64210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, ip_fragmented, mask, frag); // ? 64310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, l3_ethertype, mask, ethertype); // ? 64410b69418SYevgeny Kliteynik DR_STE_SET_ONES(eth_l2_src_v1, bit_mask, l3_type, mask, ip_version); 64510b69418SYevgeny Kliteynik 64610b69418SYevgeny Kliteynik if (mask->svlan_tag || mask->cvlan_tag) { 64710b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, bit_mask, first_vlan_qualifier, -1); 64810b69418SYevgeny Kliteynik mask->cvlan_tag = 0; 64910b69418SYevgeny Kliteynik mask->svlan_tag = 0; 65010b69418SYevgeny Kliteynik } 65110b69418SYevgeny Kliteynik 65210b69418SYevgeny Kliteynik if (inner) { 65310b69418SYevgeny Kliteynik if (misc_mask->inner_second_cvlan_tag || 65410b69418SYevgeny Kliteynik misc_mask->inner_second_svlan_tag) { 65510b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, bit_mask, second_vlan_qualifier, -1); 65610b69418SYevgeny Kliteynik misc_mask->inner_second_cvlan_tag = 0; 65710b69418SYevgeny Kliteynik misc_mask->inner_second_svlan_tag = 0; 65810b69418SYevgeny Kliteynik } 65910b69418SYevgeny Kliteynik 66010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 66110b69418SYevgeny Kliteynik second_vlan_id, misc_mask, inner_second_vid); 66210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 66310b69418SYevgeny Kliteynik second_cfi, misc_mask, inner_second_cfi); 66410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 66510b69418SYevgeny Kliteynik second_priority, misc_mask, inner_second_prio); 66610b69418SYevgeny Kliteynik } else { 66710b69418SYevgeny Kliteynik if (misc_mask->outer_second_cvlan_tag || 66810b69418SYevgeny Kliteynik misc_mask->outer_second_svlan_tag) { 66910b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, bit_mask, second_vlan_qualifier, -1); 67010b69418SYevgeny Kliteynik misc_mask->outer_second_cvlan_tag = 0; 67110b69418SYevgeny Kliteynik misc_mask->outer_second_svlan_tag = 0; 67210b69418SYevgeny Kliteynik } 67310b69418SYevgeny Kliteynik 67410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 67510b69418SYevgeny Kliteynik second_vlan_id, misc_mask, outer_second_vid); 67610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 67710b69418SYevgeny Kliteynik second_cfi, misc_mask, outer_second_cfi); 67810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 67910b69418SYevgeny Kliteynik second_priority, misc_mask, outer_second_prio); 68010b69418SYevgeny Kliteynik } 68110b69418SYevgeny Kliteynik } 68210b69418SYevgeny Kliteynik 68310b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l2_src_or_dst_tag(struct mlx5dr_match_param *value, 68410b69418SYevgeny Kliteynik bool inner, u8 *tag) 68510b69418SYevgeny Kliteynik { 68610b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = inner ? &value->inner : &value->outer; 68710b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc_spec = &value->misc; 68810b69418SYevgeny Kliteynik 68910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, first_vlan_id, spec, first_vid); 69010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, first_cfi, spec, first_cfi); 69110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, first_priority, spec, first_prio); 69210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, ip_fragmented, spec, frag); 69310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, l3_ethertype, spec, ethertype); 69410b69418SYevgeny Kliteynik 69510b69418SYevgeny Kliteynik if (spec->ip_version == IP_VERSION_IPV4) { 69610b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, l3_type, STE_IPV4); 69710b69418SYevgeny Kliteynik spec->ip_version = 0; 69810b69418SYevgeny Kliteynik } else if (spec->ip_version == IP_VERSION_IPV6) { 69910b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, l3_type, STE_IPV6); 70010b69418SYevgeny Kliteynik spec->ip_version = 0; 70110b69418SYevgeny Kliteynik } else if (spec->ip_version) { 70210b69418SYevgeny Kliteynik return -EINVAL; 70310b69418SYevgeny Kliteynik } 70410b69418SYevgeny Kliteynik 70510b69418SYevgeny Kliteynik if (spec->cvlan_tag) { 70610b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, first_vlan_qualifier, DR_STE_CVLAN); 70710b69418SYevgeny Kliteynik spec->cvlan_tag = 0; 70810b69418SYevgeny Kliteynik } else if (spec->svlan_tag) { 70910b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, first_vlan_qualifier, DR_STE_SVLAN); 71010b69418SYevgeny Kliteynik spec->svlan_tag = 0; 71110b69418SYevgeny Kliteynik } 71210b69418SYevgeny Kliteynik 71310b69418SYevgeny Kliteynik if (inner) { 71410b69418SYevgeny Kliteynik if (misc_spec->inner_second_cvlan_tag) { 71510b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, second_vlan_qualifier, DR_STE_CVLAN); 71610b69418SYevgeny Kliteynik misc_spec->inner_second_cvlan_tag = 0; 71710b69418SYevgeny Kliteynik } else if (misc_spec->inner_second_svlan_tag) { 71810b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, second_vlan_qualifier, DR_STE_SVLAN); 71910b69418SYevgeny Kliteynik misc_spec->inner_second_svlan_tag = 0; 72010b69418SYevgeny Kliteynik } 72110b69418SYevgeny Kliteynik 72210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_vlan_id, misc_spec, inner_second_vid); 72310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_cfi, misc_spec, inner_second_cfi); 72410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_priority, misc_spec, inner_second_prio); 72510b69418SYevgeny Kliteynik } else { 72610b69418SYevgeny Kliteynik if (misc_spec->outer_second_cvlan_tag) { 72710b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, second_vlan_qualifier, DR_STE_CVLAN); 72810b69418SYevgeny Kliteynik misc_spec->outer_second_cvlan_tag = 0; 72910b69418SYevgeny Kliteynik } else if (misc_spec->outer_second_svlan_tag) { 73010b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, second_vlan_qualifier, DR_STE_SVLAN); 73110b69418SYevgeny Kliteynik misc_spec->outer_second_svlan_tag = 0; 73210b69418SYevgeny Kliteynik } 73310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_vlan_id, misc_spec, outer_second_vid); 73410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_cfi, misc_spec, outer_second_cfi); 73510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_priority, misc_spec, outer_second_prio); 73610b69418SYevgeny Kliteynik } 73710b69418SYevgeny Kliteynik 73810b69418SYevgeny Kliteynik return 0; 73910b69418SYevgeny Kliteynik } 74010b69418SYevgeny Kliteynik 74110b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_src_bit_mask(struct mlx5dr_match_param *value, 74210b69418SYevgeny Kliteynik bool inner, u8 *bit_mask) 74310b69418SYevgeny Kliteynik { 74410b69418SYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 74510b69418SYevgeny Kliteynik 74610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, smac_47_16, mask, smac_47_16); 74710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, smac_15_0, mask, smac_15_0); 74810b69418SYevgeny Kliteynik 74910b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_src_or_dst_bit_mask(value, inner, bit_mask); 75010b69418SYevgeny Kliteynik } 75110b69418SYevgeny Kliteynik 75210b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l2_src_tag(struct mlx5dr_match_param *value, 75310b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 75410b69418SYevgeny Kliteynik u8 *tag) 75510b69418SYevgeny Kliteynik { 75610b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 75710b69418SYevgeny Kliteynik 75810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, smac_47_16, spec, smac_47_16); 75910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, smac_15_0, spec, smac_15_0); 76010b69418SYevgeny Kliteynik 76110b69418SYevgeny Kliteynik return dr_ste_v1_build_eth_l2_src_or_dst_tag(value, sb->inner, tag); 76210b69418SYevgeny Kliteynik } 76310b69418SYevgeny Kliteynik 76410b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_src_init(struct mlx5dr_ste_build *sb, 76510b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 76610b69418SYevgeny Kliteynik { 76710b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_src_bit_mask(mask, sb->inner, sb->bit_mask); 76810b69418SYevgeny Kliteynik 76910b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL2_SRC, sb->inner); 77010b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 77110b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l2_src_tag; 77210b69418SYevgeny Kliteynik } 77310b69418SYevgeny Kliteynik 77410b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_dst_bit_mask(struct mlx5dr_match_param *value, 77510b69418SYevgeny Kliteynik bool inner, u8 *bit_mask) 77610b69418SYevgeny Kliteynik { 77710b69418SYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 77810b69418SYevgeny Kliteynik 77910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_dst_v1, bit_mask, dmac_47_16, mask, dmac_47_16); 78010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_dst_v1, bit_mask, dmac_15_0, mask, dmac_15_0); 78110b69418SYevgeny Kliteynik 78210b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_src_or_dst_bit_mask(value, inner, bit_mask); 78310b69418SYevgeny Kliteynik } 78410b69418SYevgeny Kliteynik 78510b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l2_dst_tag(struct mlx5dr_match_param *value, 78610b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 78710b69418SYevgeny Kliteynik u8 *tag) 78810b69418SYevgeny Kliteynik { 78910b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 79010b69418SYevgeny Kliteynik 79110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_dst_v1, tag, dmac_47_16, spec, dmac_47_16); 79210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_dst_v1, tag, dmac_15_0, spec, dmac_15_0); 79310b69418SYevgeny Kliteynik 79410b69418SYevgeny Kliteynik return dr_ste_v1_build_eth_l2_src_or_dst_tag(value, sb->inner, tag); 79510b69418SYevgeny Kliteynik } 79610b69418SYevgeny Kliteynik 79710b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_dst_init(struct mlx5dr_ste_build *sb, 79810b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 79910b69418SYevgeny Kliteynik { 80010b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_dst_bit_mask(mask, sb->inner, sb->bit_mask); 80110b69418SYevgeny Kliteynik 80210b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL2, sb->inner); 80310b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 80410b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l2_dst_tag; 80510b69418SYevgeny Kliteynik } 80610b69418SYevgeny Kliteynik 80710b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_tnl_bit_mask(struct mlx5dr_match_param *value, 80810b69418SYevgeny Kliteynik bool inner, u8 *bit_mask) 80910b69418SYevgeny Kliteynik { 81010b69418SYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 81110b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 81210b69418SYevgeny Kliteynik 81310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, dmac_47_16, mask, dmac_47_16); 81410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, dmac_15_0, mask, dmac_15_0); 81510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, first_vlan_id, mask, first_vid); 81610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, first_cfi, mask, first_cfi); 81710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, first_priority, mask, first_prio); 81810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, ip_fragmented, mask, frag); 81910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, l3_ethertype, mask, ethertype); 82010b69418SYevgeny Kliteynik DR_STE_SET_ONES(eth_l2_tnl_v1, bit_mask, l3_type, mask, ip_version); 82110b69418SYevgeny Kliteynik 82210b69418SYevgeny Kliteynik if (misc->vxlan_vni) { 82310b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, bit_mask, 82410b69418SYevgeny Kliteynik l2_tunneling_network_id, (misc->vxlan_vni << 8)); 82510b69418SYevgeny Kliteynik misc->vxlan_vni = 0; 82610b69418SYevgeny Kliteynik } 82710b69418SYevgeny Kliteynik 82810b69418SYevgeny Kliteynik if (mask->svlan_tag || mask->cvlan_tag) { 82910b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, bit_mask, first_vlan_qualifier, -1); 83010b69418SYevgeny Kliteynik mask->cvlan_tag = 0; 83110b69418SYevgeny Kliteynik mask->svlan_tag = 0; 83210b69418SYevgeny Kliteynik } 83310b69418SYevgeny Kliteynik } 83410b69418SYevgeny Kliteynik 83510b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l2_tnl_tag(struct mlx5dr_match_param *value, 83610b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 83710b69418SYevgeny Kliteynik u8 *tag) 83810b69418SYevgeny Kliteynik { 83910b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 84010b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 84110b69418SYevgeny Kliteynik 84210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, dmac_47_16, spec, dmac_47_16); 84310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, dmac_15_0, spec, dmac_15_0); 84410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, first_vlan_id, spec, first_vid); 84510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, first_cfi, spec, first_cfi); 84610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, ip_fragmented, spec, frag); 84710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, first_priority, spec, first_prio); 84810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, l3_ethertype, spec, ethertype); 84910b69418SYevgeny Kliteynik 85010b69418SYevgeny Kliteynik if (misc->vxlan_vni) { 85110b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, tag, l2_tunneling_network_id, 85210b69418SYevgeny Kliteynik (misc->vxlan_vni << 8)); 85310b69418SYevgeny Kliteynik misc->vxlan_vni = 0; 85410b69418SYevgeny Kliteynik } 85510b69418SYevgeny Kliteynik 85610b69418SYevgeny Kliteynik if (spec->cvlan_tag) { 85710b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, tag, first_vlan_qualifier, DR_STE_CVLAN); 85810b69418SYevgeny Kliteynik spec->cvlan_tag = 0; 85910b69418SYevgeny Kliteynik } else if (spec->svlan_tag) { 86010b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, tag, first_vlan_qualifier, DR_STE_SVLAN); 86110b69418SYevgeny Kliteynik spec->svlan_tag = 0; 86210b69418SYevgeny Kliteynik } 86310b69418SYevgeny Kliteynik 86410b69418SYevgeny Kliteynik if (spec->ip_version == IP_VERSION_IPV4) { 86510b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, tag, l3_type, STE_IPV4); 86610b69418SYevgeny Kliteynik spec->ip_version = 0; 86710b69418SYevgeny Kliteynik } else if (spec->ip_version == IP_VERSION_IPV6) { 86810b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, tag, l3_type, STE_IPV6); 86910b69418SYevgeny Kliteynik spec->ip_version = 0; 87010b69418SYevgeny Kliteynik } else if (spec->ip_version) { 87110b69418SYevgeny Kliteynik return -EINVAL; 87210b69418SYevgeny Kliteynik } 87310b69418SYevgeny Kliteynik 87410b69418SYevgeny Kliteynik return 0; 87510b69418SYevgeny Kliteynik } 87610b69418SYevgeny Kliteynik 87710b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_tnl_init(struct mlx5dr_ste_build *sb, 87810b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 87910b69418SYevgeny Kliteynik { 88010b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_tnl_bit_mask(mask, sb->inner, sb->bit_mask); 88110b69418SYevgeny Kliteynik 88210b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_ETHL2_TNL; 88310b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 88410b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l2_tnl_tag; 88510b69418SYevgeny Kliteynik } 88610b69418SYevgeny Kliteynik 88710b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l3_ipv4_misc_tag(struct mlx5dr_match_param *value, 88810b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 88910b69418SYevgeny Kliteynik u8 *tag) 89010b69418SYevgeny Kliteynik { 89110b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 89210b69418SYevgeny Kliteynik 89310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_misc_v1, tag, time_to_live, spec, ttl_hoplimit); 89410b69418SYevgeny Kliteynik 89510b69418SYevgeny Kliteynik return 0; 89610b69418SYevgeny Kliteynik } 89710b69418SYevgeny Kliteynik 89810b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l3_ipv4_misc_init(struct mlx5dr_ste_build *sb, 89910b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 90010b69418SYevgeny Kliteynik { 90110b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l3_ipv4_misc_tag(mask, sb, sb->bit_mask); 90210b69418SYevgeny Kliteynik 90310b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL3_IPV4_MISC, sb->inner); 90410b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 90510b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l3_ipv4_misc_tag; 90610b69418SYevgeny Kliteynik } 90710b69418SYevgeny Kliteynik 90810b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_ipv6_l3_l4_tag(struct mlx5dr_match_param *value, 90910b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 91010b69418SYevgeny Kliteynik u8 *tag) 91110b69418SYevgeny Kliteynik { 91210b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 91310b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 91410b69418SYevgeny Kliteynik 91510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, dst_port, spec, tcp_dport); 91610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, src_port, spec, tcp_sport); 91710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, dst_port, spec, udp_dport); 91810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, src_port, spec, udp_sport); 91910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, protocol, spec, ip_protocol); 92010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, fragmented, spec, frag); 92110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, dscp, spec, ip_dscp); 92210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, ecn, spec, ip_ecn); 92310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, ipv6_hop_limit, spec, ttl_hoplimit); 92410b69418SYevgeny Kliteynik 92510b69418SYevgeny Kliteynik if (sb->inner) 92610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, flow_label, misc, inner_ipv6_flow_label); 92710b69418SYevgeny Kliteynik else 92810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, flow_label, misc, outer_ipv6_flow_label); 92910b69418SYevgeny Kliteynik 93010b69418SYevgeny Kliteynik if (spec->tcp_flags) { 93110b69418SYevgeny Kliteynik DR_STE_SET_TCP_FLAGS(eth_l4_v1, tag, spec); 93210b69418SYevgeny Kliteynik spec->tcp_flags = 0; 93310b69418SYevgeny Kliteynik } 93410b69418SYevgeny Kliteynik 93510b69418SYevgeny Kliteynik return 0; 93610b69418SYevgeny Kliteynik } 93710b69418SYevgeny Kliteynik 93810b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_ipv6_l3_l4_init(struct mlx5dr_ste_build *sb, 93910b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 94010b69418SYevgeny Kliteynik { 94110b69418SYevgeny Kliteynik dr_ste_v1_build_eth_ipv6_l3_l4_tag(mask, sb, sb->bit_mask); 94210b69418SYevgeny Kliteynik 94310b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL4, sb->inner); 94410b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 94510b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_ipv6_l3_l4_tag; 94610b69418SYevgeny Kliteynik } 94710b69418SYevgeny Kliteynik 94810b69418SYevgeny Kliteynik static int dr_ste_v1_build_mpls_tag(struct mlx5dr_match_param *value, 94910b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 95010b69418SYevgeny Kliteynik u8 *tag) 95110b69418SYevgeny Kliteynik { 95210b69418SYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 95310b69418SYevgeny Kliteynik 95410b69418SYevgeny Kliteynik if (sb->inner) 95510b69418SYevgeny Kliteynik DR_STE_SET_MPLS(mpls_v1, misc2, inner, tag); 95610b69418SYevgeny Kliteynik else 95710b69418SYevgeny Kliteynik DR_STE_SET_MPLS(mpls_v1, misc2, outer, tag); 95810b69418SYevgeny Kliteynik 95910b69418SYevgeny Kliteynik return 0; 96010b69418SYevgeny Kliteynik } 96110b69418SYevgeny Kliteynik 96210b69418SYevgeny Kliteynik static void dr_ste_v1_build_mpls_init(struct mlx5dr_ste_build *sb, 96310b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 96410b69418SYevgeny Kliteynik { 96510b69418SYevgeny Kliteynik dr_ste_v1_build_mpls_tag(mask, sb, sb->bit_mask); 96610b69418SYevgeny Kliteynik 96710b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(MPLS, sb->inner); 96810b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 96910b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_mpls_tag; 97010b69418SYevgeny Kliteynik } 97110b69418SYevgeny Kliteynik 97210b69418SYevgeny Kliteynik static int dr_ste_v1_build_tnl_gre_tag(struct mlx5dr_match_param *value, 97310b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 97410b69418SYevgeny Kliteynik u8 *tag) 97510b69418SYevgeny Kliteynik { 97610b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 97710b69418SYevgeny Kliteynik 97810b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_protocol, misc, gre_protocol); 97910b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_k_present, misc, gre_k_present); 98010b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_key_h, misc, gre_key_h); 98110b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_key_l, misc, gre_key_l); 98210b69418SYevgeny Kliteynik 98310b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_c_present, misc, gre_c_present); 98410b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_s_present, misc, gre_s_present); 98510b69418SYevgeny Kliteynik 98610b69418SYevgeny Kliteynik return 0; 98710b69418SYevgeny Kliteynik } 98810b69418SYevgeny Kliteynik 98910b69418SYevgeny Kliteynik static void dr_ste_v1_build_tnl_gre_init(struct mlx5dr_ste_build *sb, 99010b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 99110b69418SYevgeny Kliteynik { 99210b69418SYevgeny Kliteynik dr_ste_v1_build_tnl_gre_tag(mask, sb, sb->bit_mask); 99310b69418SYevgeny Kliteynik 99410b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_GRE; 99510b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 99610b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_tnl_gre_tag; 99710b69418SYevgeny Kliteynik } 99810b69418SYevgeny Kliteynik 99910b69418SYevgeny Kliteynik static int dr_ste_v1_build_tnl_mpls_tag(struct mlx5dr_match_param *value, 100010b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 100110b69418SYevgeny Kliteynik u8 *tag) 100210b69418SYevgeny Kliteynik { 100310b69418SYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 100410b69418SYevgeny Kliteynik 100510b69418SYevgeny Kliteynik if (DR_STE_IS_OUTER_MPLS_OVER_GRE_SET(misc2)) { 100610b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_label, 100710b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_gre_label); 100810b69418SYevgeny Kliteynik 100910b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_exp, 101010b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_gre_exp); 101110b69418SYevgeny Kliteynik 101210b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_s_bos, 101310b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_gre_s_bos); 101410b69418SYevgeny Kliteynik 101510b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_ttl, 101610b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_gre_ttl); 101710b69418SYevgeny Kliteynik } else { 101810b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_label, 101910b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_udp_label); 102010b69418SYevgeny Kliteynik 102110b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_exp, 102210b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_udp_exp); 102310b69418SYevgeny Kliteynik 102410b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_s_bos, 102510b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_udp_s_bos); 102610b69418SYevgeny Kliteynik 102710b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_ttl, 102810b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_udp_ttl); 102910b69418SYevgeny Kliteynik } 103010b69418SYevgeny Kliteynik 103110b69418SYevgeny Kliteynik return 0; 103210b69418SYevgeny Kliteynik } 103310b69418SYevgeny Kliteynik 103410b69418SYevgeny Kliteynik static void dr_ste_v1_build_tnl_mpls_init(struct mlx5dr_ste_build *sb, 103510b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 103610b69418SYevgeny Kliteynik { 103710b69418SYevgeny Kliteynik dr_ste_v1_build_tnl_mpls_tag(mask, sb, sb->bit_mask); 103810b69418SYevgeny Kliteynik 103910b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_MPLS_I; 104010b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 104110b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_tnl_mpls_tag; 104210b69418SYevgeny Kliteynik } 104310b69418SYevgeny Kliteynik 104410b69418SYevgeny Kliteynik static int dr_ste_v1_build_icmp_tag(struct mlx5dr_match_param *value, 104510b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 104610b69418SYevgeny Kliteynik u8 *tag) 104710b69418SYevgeny Kliteynik { 104810b69418SYevgeny Kliteynik struct mlx5dr_match_misc3 *misc3 = &value->misc3; 104910b69418SYevgeny Kliteynik bool is_ipv4 = DR_MASK_IS_ICMPV4_SET(misc3); 105010b69418SYevgeny Kliteynik u32 *icmp_header_data; 105110b69418SYevgeny Kliteynik u8 *icmp_type; 105210b69418SYevgeny Kliteynik u8 *icmp_code; 105310b69418SYevgeny Kliteynik 105410b69418SYevgeny Kliteynik if (is_ipv4) { 105510b69418SYevgeny Kliteynik icmp_header_data = &misc3->icmpv4_header_data; 105610b69418SYevgeny Kliteynik icmp_type = &misc3->icmpv4_type; 105710b69418SYevgeny Kliteynik icmp_code = &misc3->icmpv4_code; 105810b69418SYevgeny Kliteynik } else { 105910b69418SYevgeny Kliteynik icmp_header_data = &misc3->icmpv6_header_data; 106010b69418SYevgeny Kliteynik icmp_type = &misc3->icmpv6_type; 106110b69418SYevgeny Kliteynik icmp_code = &misc3->icmpv6_code; 106210b69418SYevgeny Kliteynik } 106310b69418SYevgeny Kliteynik 106410b69418SYevgeny Kliteynik MLX5_SET(ste_icmp_v1, tag, icmp_header_data, *icmp_header_data); 106510b69418SYevgeny Kliteynik MLX5_SET(ste_icmp_v1, tag, icmp_type, *icmp_type); 106610b69418SYevgeny Kliteynik MLX5_SET(ste_icmp_v1, tag, icmp_code, *icmp_code); 106710b69418SYevgeny Kliteynik 106810b69418SYevgeny Kliteynik *icmp_header_data = 0; 106910b69418SYevgeny Kliteynik *icmp_type = 0; 107010b69418SYevgeny Kliteynik *icmp_code = 0; 107110b69418SYevgeny Kliteynik 107210b69418SYevgeny Kliteynik return 0; 107310b69418SYevgeny Kliteynik } 107410b69418SYevgeny Kliteynik 107510b69418SYevgeny Kliteynik static int dr_ste_v1_build_icmp_init(struct mlx5dr_ste_build *sb, 107610b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 107710b69418SYevgeny Kliteynik { 107810b69418SYevgeny Kliteynik dr_ste_v1_build_icmp_tag(mask, sb, sb->bit_mask); 107910b69418SYevgeny Kliteynik 108010b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_ETHL4_MISC_O; 108110b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 108210b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_icmp_tag; 108310b69418SYevgeny Kliteynik 108410b69418SYevgeny Kliteynik return 0; 108510b69418SYevgeny Kliteynik } 108610b69418SYevgeny Kliteynik 108710b69418SYevgeny Kliteynik static int dr_ste_v1_build_general_purpose_tag(struct mlx5dr_match_param *value, 108810b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 108910b69418SYevgeny Kliteynik u8 *tag) 109010b69418SYevgeny Kliteynik { 109110b69418SYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 109210b69418SYevgeny Kliteynik 109310b69418SYevgeny Kliteynik DR_STE_SET_TAG(general_purpose, tag, general_purpose_lookup_field, 109410b69418SYevgeny Kliteynik misc2, metadata_reg_a); 109510b69418SYevgeny Kliteynik 109610b69418SYevgeny Kliteynik return 0; 109710b69418SYevgeny Kliteynik } 109810b69418SYevgeny Kliteynik 109910b69418SYevgeny Kliteynik static void dr_ste_v1_build_general_purpose_init(struct mlx5dr_ste_build *sb, 110010b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 110110b69418SYevgeny Kliteynik { 110210b69418SYevgeny Kliteynik dr_ste_v1_build_general_purpose_tag(mask, sb, sb->bit_mask); 110310b69418SYevgeny Kliteynik 110410b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_GENERAL_PURPOSE; 110510b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 110610b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_general_purpose_tag; 110710b69418SYevgeny Kliteynik } 110810b69418SYevgeny Kliteynik 110910b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l4_misc_tag(struct mlx5dr_match_param *value, 111010b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 111110b69418SYevgeny Kliteynik u8 *tag) 111210b69418SYevgeny Kliteynik { 111310b69418SYevgeny Kliteynik struct mlx5dr_match_misc3 *misc3 = &value->misc3; 111410b69418SYevgeny Kliteynik 111510b69418SYevgeny Kliteynik if (sb->inner) { 111610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_misc_v1, tag, seq_num, misc3, inner_tcp_seq_num); 111710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_misc_v1, tag, ack_num, misc3, inner_tcp_ack_num); 111810b69418SYevgeny Kliteynik } else { 111910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_misc_v1, tag, seq_num, misc3, outer_tcp_seq_num); 112010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_misc_v1, tag, ack_num, misc3, outer_tcp_ack_num); 112110b69418SYevgeny Kliteynik } 112210b69418SYevgeny Kliteynik 112310b69418SYevgeny Kliteynik return 0; 112410b69418SYevgeny Kliteynik } 112510b69418SYevgeny Kliteynik 112610b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l4_misc_init(struct mlx5dr_ste_build *sb, 112710b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 112810b69418SYevgeny Kliteynik { 112910b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l4_misc_tag(mask, sb, sb->bit_mask); 113010b69418SYevgeny Kliteynik 113110b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_ETHL4_MISC_O; 113210b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 113310b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l4_misc_tag; 113410b69418SYevgeny Kliteynik } 113510b69418SYevgeny Kliteynik 113610b69418SYevgeny Kliteynik static int 113710b69418SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_vxlan_gpe_tag(struct mlx5dr_match_param *value, 113810b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 113910b69418SYevgeny Kliteynik u8 *tag) 114010b69418SYevgeny Kliteynik { 114110b69418SYevgeny Kliteynik struct mlx5dr_match_misc3 *misc3 = &value->misc3; 114210b69418SYevgeny Kliteynik 114310b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_vxlan_gpe, tag, 114410b69418SYevgeny Kliteynik outer_vxlan_gpe_flags, misc3, 114510b69418SYevgeny Kliteynik outer_vxlan_gpe_flags); 114610b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_vxlan_gpe, tag, 114710b69418SYevgeny Kliteynik outer_vxlan_gpe_next_protocol, misc3, 114810b69418SYevgeny Kliteynik outer_vxlan_gpe_next_protocol); 114910b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_vxlan_gpe, tag, 115010b69418SYevgeny Kliteynik outer_vxlan_gpe_vni, misc3, 115110b69418SYevgeny Kliteynik outer_vxlan_gpe_vni); 115210b69418SYevgeny Kliteynik 115310b69418SYevgeny Kliteynik return 0; 115410b69418SYevgeny Kliteynik } 115510b69418SYevgeny Kliteynik 115610b69418SYevgeny Kliteynik static void 115710b69418SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_vxlan_gpe_init(struct mlx5dr_ste_build *sb, 115810b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 115910b69418SYevgeny Kliteynik { 116010b69418SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_vxlan_gpe_tag(mask, sb, sb->bit_mask); 116110b69418SYevgeny Kliteynik 116210b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_FLEX_PARSER_TNL_HEADER; 116310b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 116410b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_flex_parser_tnl_vxlan_gpe_tag; 116510b69418SYevgeny Kliteynik } 116610b69418SYevgeny Kliteynik 116710b69418SYevgeny Kliteynik static int 116810b69418SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_geneve_tag(struct mlx5dr_match_param *value, 116910b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 117010b69418SYevgeny Kliteynik u8 *tag) 117110b69418SYevgeny Kliteynik { 117210b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 117310b69418SYevgeny Kliteynik 117410b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_geneve, tag, 117510b69418SYevgeny Kliteynik geneve_protocol_type, misc, geneve_protocol_type); 117610b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_geneve, tag, 117710b69418SYevgeny Kliteynik geneve_oam, misc, geneve_oam); 117810b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_geneve, tag, 117910b69418SYevgeny Kliteynik geneve_opt_len, misc, geneve_opt_len); 118010b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_geneve, tag, 118110b69418SYevgeny Kliteynik geneve_vni, misc, geneve_vni); 118210b69418SYevgeny Kliteynik 118310b69418SYevgeny Kliteynik return 0; 118410b69418SYevgeny Kliteynik } 118510b69418SYevgeny Kliteynik 118610b69418SYevgeny Kliteynik static void 118710b69418SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_geneve_init(struct mlx5dr_ste_build *sb, 118810b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 118910b69418SYevgeny Kliteynik { 119010b69418SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_geneve_tag(mask, sb, sb->bit_mask); 119110b69418SYevgeny Kliteynik 119210b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_FLEX_PARSER_TNL_HEADER; 119310b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 119410b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_flex_parser_tnl_geneve_tag; 119510b69418SYevgeny Kliteynik } 119610b69418SYevgeny Kliteynik 119710b69418SYevgeny Kliteynik static int dr_ste_v1_build_register_0_tag(struct mlx5dr_match_param *value, 119810b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 119910b69418SYevgeny Kliteynik u8 *tag) 120010b69418SYevgeny Kliteynik { 120110b69418SYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 120210b69418SYevgeny Kliteynik 120310b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_0, tag, register_0_h, misc2, metadata_reg_c_0); 120410b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_0, tag, register_0_l, misc2, metadata_reg_c_1); 120510b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_0, tag, register_1_h, misc2, metadata_reg_c_2); 120610b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_0, tag, register_1_l, misc2, metadata_reg_c_3); 120710b69418SYevgeny Kliteynik 120810b69418SYevgeny Kliteynik return 0; 120910b69418SYevgeny Kliteynik } 121010b69418SYevgeny Kliteynik 121110b69418SYevgeny Kliteynik static void dr_ste_v1_build_register_0_init(struct mlx5dr_ste_build *sb, 121210b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 121310b69418SYevgeny Kliteynik { 121410b69418SYevgeny Kliteynik dr_ste_v1_build_register_0_tag(mask, sb, sb->bit_mask); 121510b69418SYevgeny Kliteynik 121610b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_STEERING_REGISTERS_0; 121710b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 121810b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_register_0_tag; 121910b69418SYevgeny Kliteynik } 122010b69418SYevgeny Kliteynik 122110b69418SYevgeny Kliteynik static int dr_ste_v1_build_register_1_tag(struct mlx5dr_match_param *value, 122210b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 122310b69418SYevgeny Kliteynik u8 *tag) 122410b69418SYevgeny Kliteynik { 122510b69418SYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 122610b69418SYevgeny Kliteynik 122710b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_1, tag, register_2_h, misc2, metadata_reg_c_4); 122810b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_1, tag, register_2_l, misc2, metadata_reg_c_5); 122910b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_1, tag, register_3_h, misc2, metadata_reg_c_6); 123010b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_1, tag, register_3_l, misc2, metadata_reg_c_7); 123110b69418SYevgeny Kliteynik 123210b69418SYevgeny Kliteynik return 0; 123310b69418SYevgeny Kliteynik } 123410b69418SYevgeny Kliteynik 123510b69418SYevgeny Kliteynik static void dr_ste_v1_build_register_1_init(struct mlx5dr_ste_build *sb, 123610b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 123710b69418SYevgeny Kliteynik { 123810b69418SYevgeny Kliteynik dr_ste_v1_build_register_1_tag(mask, sb, sb->bit_mask); 123910b69418SYevgeny Kliteynik 124010b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_STEERING_REGISTERS_1; 124110b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 124210b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_register_1_tag; 124310b69418SYevgeny Kliteynik } 124410b69418SYevgeny Kliteynik 124510b69418SYevgeny Kliteynik static void dr_ste_v1_build_src_gvmi_qpn_bit_mask(struct mlx5dr_match_param *value, 124610b69418SYevgeny Kliteynik u8 *bit_mask) 124710b69418SYevgeny Kliteynik { 124810b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc_mask = &value->misc; 124910b69418SYevgeny Kliteynik 125010b69418SYevgeny Kliteynik DR_STE_SET_ONES(src_gvmi_qp_v1, bit_mask, source_gvmi, misc_mask, source_port); 125110b69418SYevgeny Kliteynik DR_STE_SET_ONES(src_gvmi_qp_v1, bit_mask, source_qp, misc_mask, source_sqn); 125210b69418SYevgeny Kliteynik } 125310b69418SYevgeny Kliteynik 125410b69418SYevgeny Kliteynik static int dr_ste_v1_build_src_gvmi_qpn_tag(struct mlx5dr_match_param *value, 125510b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 125610b69418SYevgeny Kliteynik u8 *tag) 125710b69418SYevgeny Kliteynik { 125810b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 125910b69418SYevgeny Kliteynik struct mlx5dr_cmd_vport_cap *vport_cap; 126010b69418SYevgeny Kliteynik struct mlx5dr_domain *dmn = sb->dmn; 126110b69418SYevgeny Kliteynik struct mlx5dr_cmd_caps *caps; 126210b69418SYevgeny Kliteynik u8 *bit_mask = sb->bit_mask; 126310b69418SYevgeny Kliteynik 126410b69418SYevgeny Kliteynik DR_STE_SET_TAG(src_gvmi_qp_v1, tag, source_qp, misc, source_sqn); 126510b69418SYevgeny Kliteynik 126610b69418SYevgeny Kliteynik if (sb->vhca_id_valid) { 126710b69418SYevgeny Kliteynik /* Find port GVMI based on the eswitch_owner_vhca_id */ 126810b69418SYevgeny Kliteynik if (misc->source_eswitch_owner_vhca_id == dmn->info.caps.gvmi) 126910b69418SYevgeny Kliteynik caps = &dmn->info.caps; 127010b69418SYevgeny Kliteynik else if (dmn->peer_dmn && (misc->source_eswitch_owner_vhca_id == 127110b69418SYevgeny Kliteynik dmn->peer_dmn->info.caps.gvmi)) 127210b69418SYevgeny Kliteynik caps = &dmn->peer_dmn->info.caps; 127310b69418SYevgeny Kliteynik else 127410b69418SYevgeny Kliteynik return -EINVAL; 127510b69418SYevgeny Kliteynik 127610b69418SYevgeny Kliteynik misc->source_eswitch_owner_vhca_id = 0; 127710b69418SYevgeny Kliteynik } else { 127810b69418SYevgeny Kliteynik caps = &dmn->info.caps; 127910b69418SYevgeny Kliteynik } 128010b69418SYevgeny Kliteynik 128110b69418SYevgeny Kliteynik if (!MLX5_GET(ste_src_gvmi_qp_v1, bit_mask, source_gvmi)) 128210b69418SYevgeny Kliteynik return 0; 128310b69418SYevgeny Kliteynik 128410b69418SYevgeny Kliteynik vport_cap = mlx5dr_get_vport_cap(caps, misc->source_port); 128510b69418SYevgeny Kliteynik if (!vport_cap) { 128610b69418SYevgeny Kliteynik mlx5dr_err(dmn, "Vport 0x%x is disabled or invalid\n", 128710b69418SYevgeny Kliteynik misc->source_port); 128810b69418SYevgeny Kliteynik return -EINVAL; 128910b69418SYevgeny Kliteynik } 129010b69418SYevgeny Kliteynik 129110b69418SYevgeny Kliteynik if (vport_cap->vport_gvmi) 129210b69418SYevgeny Kliteynik MLX5_SET(ste_src_gvmi_qp_v1, tag, source_gvmi, vport_cap->vport_gvmi); 129310b69418SYevgeny Kliteynik 129410b69418SYevgeny Kliteynik misc->source_port = 0; 129510b69418SYevgeny Kliteynik return 0; 129610b69418SYevgeny Kliteynik } 129710b69418SYevgeny Kliteynik 129810b69418SYevgeny Kliteynik static void dr_ste_v1_build_src_gvmi_qpn_init(struct mlx5dr_ste_build *sb, 129910b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 130010b69418SYevgeny Kliteynik { 130110b69418SYevgeny Kliteynik dr_ste_v1_build_src_gvmi_qpn_bit_mask(mask, sb->bit_mask); 130210b69418SYevgeny Kliteynik 130310b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_SRC_QP_GVMI; 130410b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 130510b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_src_gvmi_qpn_tag; 130610b69418SYevgeny Kliteynik } 130710b69418SYevgeny Kliteynik 130810b69418SYevgeny Kliteynik struct mlx5dr_ste_ctx ste_ctx_v1 = { 1309a6098129SYevgeny Kliteynik /* Builders */ 131010b69418SYevgeny Kliteynik .build_eth_l2_src_dst_init = &dr_ste_v1_build_eth_l2_src_dst_init, 131110b69418SYevgeny Kliteynik .build_eth_l3_ipv6_src_init = &dr_ste_v1_build_eth_l3_ipv6_src_init, 131210b69418SYevgeny Kliteynik .build_eth_l3_ipv6_dst_init = &dr_ste_v1_build_eth_l3_ipv6_dst_init, 131310b69418SYevgeny Kliteynik .build_eth_l3_ipv4_5_tuple_init = &dr_ste_v1_build_eth_l3_ipv4_5_tuple_init, 131410b69418SYevgeny Kliteynik .build_eth_l2_src_init = &dr_ste_v1_build_eth_l2_src_init, 131510b69418SYevgeny Kliteynik .build_eth_l2_dst_init = &dr_ste_v1_build_eth_l2_dst_init, 131610b69418SYevgeny Kliteynik .build_eth_l2_tnl_init = &dr_ste_v1_build_eth_l2_tnl_init, 131710b69418SYevgeny Kliteynik .build_eth_l3_ipv4_misc_init = &dr_ste_v1_build_eth_l3_ipv4_misc_init, 131810b69418SYevgeny Kliteynik .build_eth_ipv6_l3_l4_init = &dr_ste_v1_build_eth_ipv6_l3_l4_init, 131910b69418SYevgeny Kliteynik .build_mpls_init = &dr_ste_v1_build_mpls_init, 132010b69418SYevgeny Kliteynik .build_tnl_gre_init = &dr_ste_v1_build_tnl_gre_init, 132110b69418SYevgeny Kliteynik .build_tnl_mpls_init = &dr_ste_v1_build_tnl_mpls_init, 132210b69418SYevgeny Kliteynik .build_icmp_init = &dr_ste_v1_build_icmp_init, 132310b69418SYevgeny Kliteynik .build_general_purpose_init = &dr_ste_v1_build_general_purpose_init, 132410b69418SYevgeny Kliteynik .build_eth_l4_misc_init = &dr_ste_v1_build_eth_l4_misc_init, 132510b69418SYevgeny Kliteynik .build_tnl_vxlan_gpe_init = &dr_ste_v1_build_flex_parser_tnl_vxlan_gpe_init, 132610b69418SYevgeny Kliteynik .build_tnl_geneve_init = &dr_ste_v1_build_flex_parser_tnl_geneve_init, 132710b69418SYevgeny Kliteynik .build_register_0_init = &dr_ste_v1_build_register_0_init, 132810b69418SYevgeny Kliteynik .build_register_1_init = &dr_ste_v1_build_register_1_init, 132910b69418SYevgeny Kliteynik .build_src_gvmi_qpn_init = &dr_ste_v1_build_src_gvmi_qpn_init, 1330a6098129SYevgeny Kliteynik /* Getters and Setters */ 1331a6098129SYevgeny Kliteynik .ste_init = &dr_ste_v1_init, 1332a6098129SYevgeny Kliteynik .set_next_lu_type = &dr_ste_v1_set_next_lu_type, 1333a6098129SYevgeny Kliteynik .get_next_lu_type = &dr_ste_v1_get_next_lu_type, 1334a6098129SYevgeny Kliteynik .set_miss_addr = &dr_ste_v1_set_miss_addr, 1335a6098129SYevgeny Kliteynik .get_miss_addr = &dr_ste_v1_get_miss_addr, 1336a6098129SYevgeny Kliteynik .set_hit_addr = &dr_ste_v1_set_hit_addr, 1337a6098129SYevgeny Kliteynik .set_byte_mask = &dr_ste_v1_set_byte_mask, 1338a6098129SYevgeny Kliteynik .get_byte_mask = &dr_ste_v1_get_byte_mask, 1339*4e856c5dSYevgeny Kliteynik /* Actions */ 1340*4e856c5dSYevgeny Kliteynik .set_actions_rx = &dr_ste_v1_set_actions_rx, 1341*4e856c5dSYevgeny Kliteynik .set_actions_tx = &dr_ste_v1_set_actions_tx, 134210b69418SYevgeny Kliteynik }; 1343