/* * Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU * General Public License (GPL) Version 2, available from the file * COPYING in the main directory of this source tree, or the * OpenIB.org BSD license below: * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * - Redistributions of source code must retain the above * copyright notice, this list of conditions and the following * disclaimer. * * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials * provided with the distribution. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #include "dr_ste.h" enum { DR_STE_V2_ACTION_MDFY_FLD_L2_OUT_0 = 0x00, DR_STE_V2_ACTION_MDFY_FLD_L2_OUT_1 = 0x01, DR_STE_V2_ACTION_MDFY_FLD_L2_OUT_2 = 0x02, DR_STE_V2_ACTION_MDFY_FLD_SRC_L2_OUT_0 = 0x08, DR_STE_V2_ACTION_MDFY_FLD_SRC_L2_OUT_1 = 0x09, DR_STE_V2_ACTION_MDFY_FLD_L3_OUT_0 = 0x0e, DR_STE_V2_ACTION_MDFY_FLD_L4_OUT_0 = 0x18, DR_STE_V2_ACTION_MDFY_FLD_L4_OUT_1 = 0x19, DR_STE_V2_ACTION_MDFY_FLD_IPV4_OUT_0 = 0x40, DR_STE_V2_ACTION_MDFY_FLD_IPV4_OUT_1 = 0x41, DR_STE_V2_ACTION_MDFY_FLD_IPV6_DST_OUT_0 = 0x44, DR_STE_V2_ACTION_MDFY_FLD_IPV6_DST_OUT_1 = 0x45, DR_STE_V2_ACTION_MDFY_FLD_IPV6_DST_OUT_2 = 0x46, DR_STE_V2_ACTION_MDFY_FLD_IPV6_DST_OUT_3 = 0x47, DR_STE_V2_ACTION_MDFY_FLD_IPV6_SRC_OUT_0 = 0x4c, DR_STE_V2_ACTION_MDFY_FLD_IPV6_SRC_OUT_1 = 0x4d, DR_STE_V2_ACTION_MDFY_FLD_IPV6_SRC_OUT_2 = 0x4e, DR_STE_V2_ACTION_MDFY_FLD_IPV6_SRC_OUT_3 = 0x4f, DR_STE_V2_ACTION_MDFY_FLD_TCP_MISC_0 = 0x5e, DR_STE_V2_ACTION_MDFY_FLD_TCP_MISC_1 = 0x5f, DR_STE_V2_ACTION_MDFY_FLD_METADATA_2_CQE = 0x7b, DR_STE_V2_ACTION_MDFY_FLD_GNRL_PURPOSE = 0x7c, DR_STE_V2_ACTION_MDFY_FLD_FLEX_PARSER_7 = 0x82, DR_STE_V2_ACTION_MDFY_FLD_FLEX_PARSER_6 = 0x83, DR_STE_V2_ACTION_MDFY_FLD_FLEX_PARSER_5 = 0x84, DR_STE_V2_ACTION_MDFY_FLD_FLEX_PARSER_4 = 0x85, DR_STE_V2_ACTION_MDFY_FLD_FLEX_PARSER_3 = 0x86, DR_STE_V2_ACTION_MDFY_FLD_FLEX_PARSER_2 = 0x87, DR_STE_V2_ACTION_MDFY_FLD_FLEX_PARSER_1 = 0x88, DR_STE_V2_ACTION_MDFY_FLD_FLEX_PARSER_0 = 0x89, DR_STE_V2_ACTION_MDFY_FLD_REGISTER_2_0 = 0x90, DR_STE_V2_ACTION_MDFY_FLD_REGISTER_2_1 = 0x91, DR_STE_V2_ACTION_MDFY_FLD_REGISTER_1_0 = 0x92, DR_STE_V2_ACTION_MDFY_FLD_REGISTER_1_1 = 0x93, DR_STE_V2_ACTION_MDFY_FLD_REGISTER_0_0 = 0x94, DR_STE_V2_ACTION_MDFY_FLD_REGISTER_0_1 = 0x95, }; static const struct dr_ste_action_modify_field dr_ste_v2_action_modify_field_arr[] = { [MLX5_ACTION_IN_FIELD_OUT_SMAC_47_16] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_SRC_L2_OUT_0, .start = 0, .end = 31, }, [MLX5_ACTION_IN_FIELD_OUT_SMAC_15_0] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_SRC_L2_OUT_1, .start = 16, .end = 31, }, [MLX5_ACTION_IN_FIELD_OUT_ETHERTYPE] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_L2_OUT_1, .start = 0, .end = 15, }, [MLX5_ACTION_IN_FIELD_OUT_DMAC_47_16] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_L2_OUT_0, .start = 0, .end = 31, }, [MLX5_ACTION_IN_FIELD_OUT_DMAC_15_0] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_L2_OUT_1, .start = 16, .end = 31, }, [MLX5_ACTION_IN_FIELD_OUT_IP_DSCP] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_L3_OUT_0, .start = 18, .end = 23, }, [MLX5_ACTION_IN_FIELD_OUT_IP_ECN] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_L3_OUT_0, .start = 16, .end = 17, }, [MLX5_ACTION_IN_FIELD_OUT_TCP_FLAGS] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_L4_OUT_1, .start = 16, .end = 24, .l4_type = DR_STE_ACTION_MDFY_TYPE_L4_TCP, }, [MLX5_ACTION_IN_FIELD_OUT_TCP_SPORT] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_L4_OUT_0, .start = 16, .end = 31, .l4_type = DR_STE_ACTION_MDFY_TYPE_L4_TCP, }, [MLX5_ACTION_IN_FIELD_OUT_TCP_DPORT] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_L4_OUT_0, .start = 0, .end = 15, .l4_type = DR_STE_ACTION_MDFY_TYPE_L4_TCP, }, [MLX5_ACTION_IN_FIELD_OUT_IP_TTL] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_L3_OUT_0, .start = 8, .end = 15, .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV4, }, [MLX5_ACTION_IN_FIELD_OUT_IPV6_HOPLIMIT] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_L3_OUT_0, .start = 8, .end = 15, .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, }, [MLX5_ACTION_IN_FIELD_OUT_UDP_SPORT] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_L4_OUT_0, .start = 16, .end = 31, .l4_type = DR_STE_ACTION_MDFY_TYPE_L4_UDP, }, [MLX5_ACTION_IN_FIELD_OUT_UDP_DPORT] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_L4_OUT_0, .start = 0, .end = 15, .l4_type = DR_STE_ACTION_MDFY_TYPE_L4_UDP, }, [MLX5_ACTION_IN_FIELD_OUT_SIPV6_127_96] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_IPV6_SRC_OUT_0, .start = 0, .end = 31, .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, }, [MLX5_ACTION_IN_FIELD_OUT_SIPV6_95_64] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_IPV6_SRC_OUT_1, .start = 0, .end = 31, .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, }, [MLX5_ACTION_IN_FIELD_OUT_SIPV6_63_32] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_IPV6_SRC_OUT_2, .start = 0, .end = 31, .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, }, [MLX5_ACTION_IN_FIELD_OUT_SIPV6_31_0] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_IPV6_SRC_OUT_3, .start = 0, .end = 31, .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, }, [MLX5_ACTION_IN_FIELD_OUT_DIPV6_127_96] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_IPV6_DST_OUT_0, .start = 0, .end = 31, .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, }, [MLX5_ACTION_IN_FIELD_OUT_DIPV6_95_64] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_IPV6_DST_OUT_1, .start = 0, .end = 31, .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, }, [MLX5_ACTION_IN_FIELD_OUT_DIPV6_63_32] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_IPV6_DST_OUT_2, .start = 0, .end = 31, .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, }, [MLX5_ACTION_IN_FIELD_OUT_DIPV6_31_0] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_IPV6_DST_OUT_3, .start = 0, .end = 31, .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, }, [MLX5_ACTION_IN_FIELD_OUT_SIPV4] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_IPV4_OUT_0, .start = 0, .end = 31, .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV4, }, [MLX5_ACTION_IN_FIELD_OUT_DIPV4] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_IPV4_OUT_1, .start = 0, .end = 31, .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV4, }, [MLX5_ACTION_IN_FIELD_OUT_METADATA_REGA] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_GNRL_PURPOSE, .start = 0, .end = 31, }, [MLX5_ACTION_IN_FIELD_OUT_METADATA_REGB] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_METADATA_2_CQE, .start = 0, .end = 31, }, [MLX5_ACTION_IN_FIELD_OUT_METADATA_REGC_0] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_REGISTER_0_0, .start = 0, .end = 31, }, [MLX5_ACTION_IN_FIELD_OUT_METADATA_REGC_1] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_REGISTER_0_1, .start = 0, .end = 31, }, [MLX5_ACTION_IN_FIELD_OUT_METADATA_REGC_2] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_REGISTER_1_0, .start = 0, .end = 31, }, [MLX5_ACTION_IN_FIELD_OUT_METADATA_REGC_3] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_REGISTER_1_1, .start = 0, .end = 31, }, [MLX5_ACTION_IN_FIELD_OUT_METADATA_REGC_4] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_REGISTER_2_0, .start = 0, .end = 31, }, [MLX5_ACTION_IN_FIELD_OUT_METADATA_REGC_5] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_REGISTER_2_1, .start = 0, .end = 31, }, [MLX5_ACTION_IN_FIELD_OUT_TCP_SEQ_NUM] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_TCP_MISC_0, .start = 0, .end = 31, }, [MLX5_ACTION_IN_FIELD_OUT_TCP_ACK_NUM] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_TCP_MISC_1, .start = 0, .end = 31, }, [MLX5_ACTION_IN_FIELD_OUT_FIRST_VID] = { .hw_field = DR_STE_V2_ACTION_MDFY_FLD_L2_OUT_2, .start = 0, .end = 15, }, [MLX5_ACTION_IN_FIELD_OUT_GTPU_TEID] = { .flags = DR_STE_ACTION_MODIFY_FLAG_REQ_FLEX, .start = 0, .end = 31, }, }; static struct dr_ste_ctx ste_ctx_v2; static pthread_mutex_t ctx_mutex = PTHREAD_MUTEX_INITIALIZER; struct dr_ste_ctx *dr_ste_get_ctx_v2(void) { pthread_mutex_lock(&ctx_mutex); if (!ste_ctx_v2.actions_caps) { ste_ctx_v2 = *dr_ste_get_ctx_v1(); ste_ctx_v2.actions_caps = DR_STE_CTX_ACTION_CAP_TX_POP | DR_STE_CTX_ACTION_CAP_RX_PUSH | DR_STE_CTX_ACTION_CAP_RX_ENCAP | DR_STE_CTX_ACTION_CAP_MODIFY_HDR_INLINE; ste_ctx_v2.action_modify_field_arr = dr_ste_v2_action_modify_field_arr; ste_ctx_v2.action_modify_field_arr_size = ARRAY_SIZE(dr_ste_v2_action_modify_field_arr); } pthread_mutex_unlock(&ctx_mutex); return &ste_ctx_v2; }