@@ -640,6 +640,7 @@ static void mlx5dr_action_fill_stc_attr(struct mlx5dr_action *action,
case MLX5DR_ACTION_TYP_REFORMAT_TNL_L3_TO_L2:
case MLX5DR_ACTION_TYP_MODIFY_HDR:
attr->action_offset = MLX5DR_ACTION_OFFSET_DW6;
+ attr->reparse_mode = MLX5_IFC_STC_REPARSE_IGNORE;
if (action->modify_header.require_reparse)
attr->reparse_mode = MLX5_IFC_STC_REPARSE_ALWAYS;
@@ -678,9 +679,12 @@ static void mlx5dr_action_fill_stc_attr(struct mlx5dr_action *action,
case MLX5DR_ACTION_TYP_REFORMAT_L2_TO_TNL_L2:
case MLX5DR_ACTION_TYP_REFORMAT_L2_TO_TNL_L3:
case MLX5DR_ACTION_TYP_INSERT_HEADER:
+ attr->reparse_mode = MLX5_IFC_STC_REPARSE_ALWAYS;
+ if (!action->reformat.require_reparse)
+ attr->reparse_mode = MLX5_IFC_STC_REPARSE_IGNORE;
+
attr->action_type = MLX5_IFC_STC_ACTION_TYPE_HEADER_INSERT;
attr->action_offset = MLX5DR_ACTION_OFFSET_DW6;
- attr->reparse_mode = MLX5_IFC_STC_REPARSE_ALWAYS;
attr->insert_header.encap = action->reformat.encap;
attr->insert_header.insert_anchor = action->reformat.anchor;
attr->insert_header.arg_id = action->reformat.arg_obj->id;
@@ -1441,7 +1445,7 @@ static int
mlx5dr_action_handle_insert_with_ptr(struct mlx5dr_action *action,
uint8_t num_of_hdrs,
struct mlx5dr_action_reformat_header *hdrs,
- uint32_t log_bulk_sz)
+ uint32_t log_bulk_sz, uint32_t reparse)
{
struct mlx5dr_devx_obj *arg_obj;
size_t max_sz = 0;
@@ -1478,6 +1482,11 @@ mlx5dr_action_handle_insert_with_ptr(struct mlx5dr_action *action,
action[i].reformat.encap = 1;
}
+ if (likely(reparse == MLX5DR_ACTION_STC_REPARSE_DEFAULT))
+ action[i].reformat.require_reparse = true;
+ else if (reparse == MLX5DR_ACTION_STC_REPARSE_ON)
+ action[i].reformat.require_reparse = true;
+
ret = mlx5dr_action_create_stcs(&action[i], NULL);
if (ret) {
DR_LOG(ERR, "Failed to create stc for reformat");
@@ -1514,7 +1523,8 @@ mlx5dr_action_handle_l2_to_tunnel_l3(struct mlx5dr_action *action,
ret = mlx5dr_action_handle_insert_with_ptr(action,
num_of_hdrs,
hdrs,
- log_bulk_sz);
+ log_bulk_sz,
+ MLX5DR_ACTION_STC_REPARSE_DEFAULT);
if (ret)
goto put_shared_stc;
@@ -1657,7 +1667,8 @@ mlx5dr_action_create_reformat_hws(struct mlx5dr_action *action,
ret = mlx5dr_action_create_stcs(action, NULL);
break;
case MLX5DR_ACTION_TYP_REFORMAT_L2_TO_TNL_L2:
- ret = mlx5dr_action_handle_insert_with_ptr(action, num_of_hdrs, hdrs, bulk_size);
+ ret = mlx5dr_action_handle_insert_with_ptr(action, num_of_hdrs, hdrs, bulk_size,
+ MLX5DR_ACTION_STC_REPARSE_DEFAULT);
break;
case MLX5DR_ACTION_TYP_REFORMAT_L2_TO_TNL_L3:
ret = mlx5dr_action_handle_l2_to_tunnel_l3(action, num_of_hdrs, hdrs, bulk_size);
@@ -1765,7 +1776,8 @@ static int
mlx5dr_action_create_modify_header_hws(struct mlx5dr_action *action,
uint8_t num_of_patterns,
struct mlx5dr_action_mh_pattern *pattern,
- uint32_t log_bulk_size)
+ uint32_t log_bulk_size,
+ uint32_t reparse)
{
struct mlx5dr_devx_obj *pat_obj, *arg_obj = NULL;
struct mlx5dr_context *ctx = action->ctx;
@@ -1799,8 +1811,12 @@ mlx5dr_action_create_modify_header_hws(struct mlx5dr_action *action,
action[i].modify_header.num_of_patterns = num_of_patterns;
action[i].modify_header.max_num_of_actions = max_mh_actions;
action[i].modify_header.num_of_actions = num_actions;
- action[i].modify_header.require_reparse =
- mlx5dr_pat_require_reparse(pattern[i].data, num_actions);
+
+ if (likely(reparse == MLX5DR_ACTION_STC_REPARSE_DEFAULT))
+ action[i].modify_header.require_reparse =
+ mlx5dr_pat_require_reparse(pattern[i].data, num_actions);
+ else if (reparse == MLX5DR_ACTION_STC_REPARSE_ON)
+ action[i].modify_header.require_reparse = true;
if (num_actions == 1) {
pat_obj = NULL;
@@ -1843,12 +1859,12 @@ mlx5dr_action_create_modify_header_hws(struct mlx5dr_action *action,
return rte_errno;
}
-struct mlx5dr_action *
-mlx5dr_action_create_modify_header(struct mlx5dr_context *ctx,
- uint8_t num_of_patterns,
- struct mlx5dr_action_mh_pattern *patterns,
- uint32_t log_bulk_size,
- uint32_t flags)
+static struct mlx5dr_action *
+mlx5dr_action_create_modify_header_reparse(struct mlx5dr_context *ctx,
+ uint8_t num_of_patterns,
+ struct mlx5dr_action_mh_pattern *patterns,
+ uint32_t log_bulk_size,
+ uint32_t flags, uint32_t reparse)
{
struct mlx5dr_action *action;
int ret;
@@ -1896,7 +1912,8 @@ mlx5dr_action_create_modify_header(struct mlx5dr_context *ctx,
ret = mlx5dr_action_create_modify_header_hws(action,
num_of_patterns,
patterns,
- log_bulk_size);
+ log_bulk_size,
+ reparse);
if (ret)
goto free_action;
@@ -1907,6 +1924,17 @@ mlx5dr_action_create_modify_header(struct mlx5dr_context *ctx,
return NULL;
}
+struct mlx5dr_action *
+mlx5dr_action_create_modify_header(struct mlx5dr_context *ctx,
+ uint8_t num_of_patterns,
+ struct mlx5dr_action_mh_pattern *patterns,
+ uint32_t log_bulk_size,
+ uint32_t flags)
+{
+ return mlx5dr_action_create_modify_header_reparse(ctx, num_of_patterns, patterns,
+ log_bulk_size, flags,
+ MLX5DR_ACTION_STC_REPARSE_DEFAULT);
+}
static struct mlx5dr_devx_obj *
mlx5dr_action_dest_array_process_reformat(struct mlx5dr_context *ctx,
enum mlx5dr_action_type type,
@@ -2254,12 +2282,12 @@ mlx5dr_action_create_reformat_trailer(struct mlx5dr_context *ctx,
return action;
}
-struct mlx5dr_action *
-mlx5dr_action_create_insert_header(struct mlx5dr_context *ctx,
- uint8_t num_of_hdrs,
- struct mlx5dr_action_insert_header *hdrs,
- uint32_t log_bulk_size,
- uint32_t flags)
+static struct mlx5dr_action *
+mlx5dr_action_create_insert_header_reparse(struct mlx5dr_context *ctx,
+ uint8_t num_of_hdrs,
+ struct mlx5dr_action_insert_header *hdrs,
+ uint32_t log_bulk_size,
+ uint32_t flags, uint32_t reparse)
{
struct mlx5dr_action_reformat_header *reformat_hdrs;
struct mlx5dr_action *action;
@@ -2312,7 +2340,8 @@ mlx5dr_action_create_insert_header(struct mlx5dr_context *ctx,
}
ret = mlx5dr_action_handle_insert_with_ptr(action, num_of_hdrs,
- reformat_hdrs, log_bulk_size);
+ reformat_hdrs, log_bulk_size,
+ reparse);
if (ret) {
DR_LOG(ERR, "Failed to create HWS reformat action");
goto free_reformat_hdrs;
@@ -2329,6 +2358,18 @@ mlx5dr_action_create_insert_header(struct mlx5dr_context *ctx,
return NULL;
}
+struct mlx5dr_action *
+mlx5dr_action_create_insert_header(struct mlx5dr_context *ctx,
+ uint8_t num_of_hdrs,
+ struct mlx5dr_action_insert_header *hdrs,
+ uint32_t log_bulk_size,
+ uint32_t flags)
+{
+ return mlx5dr_action_create_insert_header_reparse(ctx, num_of_hdrs, hdrs,
+ log_bulk_size, flags,
+ MLX5DR_ACTION_STC_REPARSE_DEFAULT);
+}
+
struct mlx5dr_action *
mlx5dr_action_create_remove_header(struct mlx5dr_context *ctx,
struct mlx5dr_action_remove_header_attr *attr,
@@ -2422,8 +2463,9 @@ mlx5dr_action_create_pop_ipv6_route_ext_mhdr1(struct mlx5dr_action *action)
pattern.data = cmd;
pattern.sz = sizeof(cmd);
- return mlx5dr_action_create_modify_header(action->ctx, 1, &pattern,
- 0, action->flags);
+ return mlx5dr_action_create_modify_header_reparse(action->ctx, 1, &pattern, 0,
+ action->flags,
+ MLX5DR_ACTION_STC_REPARSE_ON);
}
static void *
@@ -2469,8 +2511,9 @@ mlx5dr_action_create_pop_ipv6_route_ext_mhdr2(struct mlx5dr_action *action)
pattern.data = cmd;
pattern.sz = sizeof(cmd);
- return mlx5dr_action_create_modify_header(action->ctx, 1, &pattern,
- 0, action->flags);
+ return mlx5dr_action_create_modify_header_reparse(action->ctx, 1, &pattern, 0,
+ action->flags,
+ MLX5DR_ACTION_STC_REPARSE_ON);
}
static void *
@@ -2496,8 +2539,9 @@ mlx5dr_action_create_pop_ipv6_route_ext_mhdr3(struct mlx5dr_action *action)
pattern.data = (__be64 *)cmd;
pattern.sz = sizeof(cmd);
- return mlx5dr_action_create_modify_header(action->ctx, 1, &pattern,
- 0, action->flags);
+ return mlx5dr_action_create_modify_header_reparse(action->ctx, 1, &pattern, 0,
+ action->flags,
+ MLX5DR_ACTION_STC_REPARSE_OFF);
}
static int
@@ -2644,8 +2688,9 @@ mlx5dr_action_create_push_ipv6_route_ext(struct mlx5dr_action *action,
insert_hdr.hdr.sz = hdr->sz;
insert_hdr.hdr.data = header;
action->ipv6_route_ext.action[0] =
- mlx5dr_action_create_insert_header(action->ctx, 1, &insert_hdr,
- bulk_size, action->flags);
+ mlx5dr_action_create_insert_header_reparse(action->ctx, 1, &insert_hdr,
+ bulk_size, action->flags,
+ MLX5DR_ACTION_STC_REPARSE_OFF);
action->ipv6_route_ext.action[1] =
mlx5dr_action_create_push_ipv6_route_ext_mhdr1(action);
action->ipv6_route_ext.action[2] =
@@ -2678,12 +2723,6 @@ mlx5dr_action_create_reformat_ipv6_ext(struct mlx5dr_context *ctx,
struct mlx5dr_action *action;
int ret;
- if (mlx5dr_context_cap_dynamic_reparse(ctx)) {
- DR_LOG(ERR, "IPv6 extension actions is not supported");
- rte_errno = ENOTSUP;
- return NULL;
- }
-
if (!mlx5dr_action_is_hws_flags(flags) ||
((flags & MLX5DR_ACTION_FLAG_SHARED) && log_bulk_size)) {
DR_LOG(ERR, "IPv6 extension flags don't fit HWS (flags: 0x%x)", flags);
@@ -2708,6 +2747,12 @@ mlx5dr_action_create_reformat_ipv6_ext(struct mlx5dr_context *ctx,
ret = mlx5dr_action_create_pop_ipv6_route_ext(action);
break;
case MLX5DR_ACTION_TYP_PUSH_IPV6_ROUTE_EXT:
+ if (!mlx5dr_context_cap_dynamic_reparse(ctx)) {
+ DR_LOG(ERR, "IPv6 routing extension push actions is not supported");
+ rte_errno = ENOTSUP;
+ goto free_action;
+ }
+
ret = mlx5dr_action_create_push_ipv6_route_ext(action, hdr, log_bulk_size);
break;
default:
@@ -65,6 +65,12 @@ enum mlx5dr_action_setter_flag {
ASF_HIT = 1 << 7,
};
+enum mlx5dr_action_stc_reparse {
+ MLX5DR_ACTION_STC_REPARSE_DEFAULT,
+ MLX5DR_ACTION_STC_REPARSE_ON,
+ MLX5DR_ACTION_STC_REPARSE_OFF,
+};
+
struct mlx5dr_action_default_stc {
struct mlx5dr_pool_chunk nop_ctr;
struct mlx5dr_pool_chunk nop_dw5;
@@ -146,6 +152,7 @@ struct mlx5dr_action {
uint8_t anchor;
uint8_t offset;
bool encap;
+ uint8_t require_reparse;
} reformat;
struct {
struct mlx5dr_action