[DR_ACTION_TYP_L2_TO_TNL_L2]    = DR_ACTION_STATE_ENCAP,
                        [DR_ACTION_TYP_L2_TO_TNL_L3]    = DR_ACTION_STATE_ENCAP,
                        [DR_ACTION_TYP_INSERT_HDR]      = DR_ACTION_STATE_ENCAP,
+                       [DR_ACTION_TYP_REMOVE_HDR]      = DR_ACTION_STATE_DECAP,
                        [DR_ACTION_TYP_MODIFY_HDR]      = DR_ACTION_STATE_MODIFY_HDR,
                        [DR_ACTION_TYP_POP_VLAN]        = DR_ACTION_STATE_MODIFY_VLAN,
                },
                        [DR_ACTION_TYP_L2_TO_TNL_L2]    = DR_ACTION_STATE_ENCAP,
                        [DR_ACTION_TYP_L2_TO_TNL_L3]    = DR_ACTION_STATE_ENCAP,
                        [DR_ACTION_TYP_INSERT_HDR]      = DR_ACTION_STATE_ENCAP,
+                       [DR_ACTION_TYP_REMOVE_HDR]      = DR_ACTION_STATE_DECAP,
                        [DR_ACTION_TYP_MODIFY_HDR]      = DR_ACTION_STATE_MODIFY_HDR,
                        [DR_ACTION_TYP_POP_VLAN]        = DR_ACTION_STATE_MODIFY_VLAN,
                },
                        [DR_ACTION_TYP_L2_TO_TNL_L2]    = DR_ACTION_STATE_ENCAP,
                        [DR_ACTION_TYP_L2_TO_TNL_L3]    = DR_ACTION_STATE_ENCAP,
                        [DR_ACTION_TYP_INSERT_HDR]      = DR_ACTION_STATE_ENCAP,
+                       [DR_ACTION_TYP_REMOVE_HDR]      = DR_ACTION_STATE_DECAP,
                        [DR_ACTION_TYP_MODIFY_HDR]      = DR_ACTION_STATE_MODIFY_HDR,
                        [DR_ACTION_TYP_PUSH_VLAN]       = DR_ACTION_STATE_MODIFY_VLAN,
                },
+               [DR_ACTION_STATE_DECAP] = {
+                       [DR_ACTION_TYP_DROP]            = DR_ACTION_STATE_TERM,
+                       [DR_ACTION_TYP_FT]              = DR_ACTION_STATE_TERM,
+                       [DR_ACTION_TYP_SAMPLER]         = DR_ACTION_STATE_TERM,
+                       [DR_ACTION_TYP_CTR]             = DR_ACTION_STATE_DECAP,
+               },
                [DR_ACTION_STATE_ENCAP] = {
                        [DR_ACTION_TYP_DROP]            = DR_ACTION_STATE_TERM,
                        [DR_ACTION_TYP_FT]              = DR_ACTION_STATE_TERM,
                        [DR_ACTION_TYP_L2_TO_TNL_L2]    = DR_ACTION_STATE_ENCAP,
                        [DR_ACTION_TYP_L2_TO_TNL_L3]    = DR_ACTION_STATE_ENCAP,
                        [DR_ACTION_TYP_INSERT_HDR]      = DR_ACTION_STATE_ENCAP,
+                       [DR_ACTION_TYP_REMOVE_HDR]      = DR_ACTION_STATE_DECAP,
                        [DR_ACTION_TYP_MODIFY_HDR]      = DR_ACTION_STATE_MODIFY_HDR,
                        [DR_ACTION_TYP_PUSH_VLAN]       = DR_ACTION_STATE_MODIFY_VLAN,
                },
                        [DR_ACTION_TYP_L2_TO_TNL_L2]    = DR_ACTION_STATE_ENCAP,
                        [DR_ACTION_TYP_L2_TO_TNL_L3]    = DR_ACTION_STATE_ENCAP,
                        [DR_ACTION_TYP_INSERT_HDR]      = DR_ACTION_STATE_ENCAP,
+                       [DR_ACTION_TYP_REMOVE_HDR]      = DR_ACTION_STATE_DECAP,
                        [DR_ACTION_TYP_MODIFY_HDR]      = DR_ACTION_STATE_MODIFY_HDR,
                        [DR_ACTION_TYP_POP_VLAN]        = DR_ACTION_STATE_MODIFY_VLAN,
                        [DR_ACTION_TYP_VPORT]           = DR_ACTION_STATE_TERM,
                        [DR_ACTION_TYP_L2_TO_TNL_L2]    = DR_ACTION_STATE_ENCAP,
                        [DR_ACTION_TYP_L2_TO_TNL_L3]    = DR_ACTION_STATE_ENCAP,
                        [DR_ACTION_TYP_INSERT_HDR]      = DR_ACTION_STATE_ENCAP,
+                       [DR_ACTION_TYP_REMOVE_HDR]      = DR_ACTION_STATE_DECAP,
                        [DR_ACTION_TYP_MODIFY_HDR]      = DR_ACTION_STATE_MODIFY_HDR,
                        [DR_ACTION_TYP_POP_VLAN]        = DR_ACTION_STATE_MODIFY_VLAN,
                        [DR_ACTION_TYP_VPORT]           = DR_ACTION_STATE_TERM,
                        [DR_ACTION_TYP_L2_TO_TNL_L2]    = DR_ACTION_STATE_ENCAP,
                        [DR_ACTION_TYP_L2_TO_TNL_L3]    = DR_ACTION_STATE_ENCAP,
                        [DR_ACTION_TYP_INSERT_HDR]      = DR_ACTION_STATE_ENCAP,
+                       [DR_ACTION_TYP_REMOVE_HDR]      = DR_ACTION_STATE_DECAP,
                        [DR_ACTION_TYP_PUSH_VLAN]       = DR_ACTION_STATE_MODIFY_VLAN,
                        [DR_ACTION_TYP_VPORT]           = DR_ACTION_STATE_TERM,
                },
+               [DR_ACTION_STATE_DECAP] = {
+                       [DR_ACTION_TYP_DROP]            = DR_ACTION_STATE_TERM,
+                       [DR_ACTION_TYP_FT]              = DR_ACTION_STATE_TERM,
+                       [DR_ACTION_TYP_CTR]             = DR_ACTION_STATE_DECAP,
+                       [DR_ACTION_TYP_VPORT]           = DR_ACTION_STATE_TERM,
+                       [DR_ACTION_TYP_SAMPLER]         = DR_ACTION_STATE_TERM,
+               },
                [DR_ACTION_STATE_ENCAP] = {
                        [DR_ACTION_TYP_DROP]            = DR_ACTION_STATE_TERM,
                        [DR_ACTION_TYP_FT]              = DR_ACTION_STATE_TERM,
                        [DR_ACTION_TYP_L2_TO_TNL_L2]    = DR_ACTION_STATE_ENCAP,
                        [DR_ACTION_TYP_L2_TO_TNL_L3]    = DR_ACTION_STATE_ENCAP,
                        [DR_ACTION_TYP_INSERT_HDR]      = DR_ACTION_STATE_ENCAP,
+                       [DR_ACTION_TYP_REMOVE_HDR]      = DR_ACTION_STATE_DECAP,
                        [DR_ACTION_TYP_PUSH_VLAN]       = DR_ACTION_STATE_MODIFY_VLAN,
                        [DR_ACTION_TYP_VPORT]           = DR_ACTION_STATE_TERM,
                },
        case DR_ACTION_REFORMAT_TYP_INSERT_HDR:
                *action_type = DR_ACTION_TYP_INSERT_HDR;
                break;
+       case DR_ACTION_REFORMAT_TYP_REMOVE_HDR:
+               *action_type = DR_ACTION_TYP_REMOVE_HDR;
+               break;
        default:
                return -EINVAL;
        }
                        attr.vlans.headers[attr.vlans.count++] = action->push_vlan->vlan_hdr;
                        break;
                case DR_ACTION_TYP_INSERT_HDR:
+               case DR_ACTION_TYP_REMOVE_HDR:
                        attr.reformat.size = action->reformat->size;
                        attr.reformat.id = action->reformat->id;
                        attr.reformat.param_0 = action->reformat->param_0;
        [DR_ACTION_TYP_VPORT]        = sizeof(struct mlx5dr_action_vport),
        [DR_ACTION_TYP_PUSH_VLAN]    = sizeof(struct mlx5dr_action_push_vlan),
        [DR_ACTION_TYP_INSERT_HDR]   = sizeof(struct mlx5dr_action_reformat),
+       [DR_ACTION_TYP_REMOVE_HDR]   = sizeof(struct mlx5dr_action_reformat),
        [DR_ACTION_TYP_SAMPLER]      = sizeof(struct mlx5dr_action_sampler),
 };
 
                                 size_t data_sz,
                                 void *data)
 {
-       if ((!data && data_sz) || (data && !data_sz) ||
-           ((reformat_param_0 || reformat_param_1) &&
-            reformat_type != DR_ACTION_TYP_INSERT_HDR) ||
-           reformat_type > DR_ACTION_TYP_INSERT_HDR) {
-               mlx5dr_dbg(dmn, "Invalid reformat parameter!\n");
+       if (reformat_type == DR_ACTION_TYP_INSERT_HDR) {
+               if ((!data && data_sz) || (data && !data_sz) ||
+                   MLX5_CAP_GEN_2(dmn->mdev, max_reformat_insert_size) < data_sz ||
+                   MLX5_CAP_GEN_2(dmn->mdev, max_reformat_insert_offset) < reformat_param_1) {
+                       mlx5dr_dbg(dmn, "Invalid reformat parameters for INSERT_HDR\n");
+                       goto out_err;
+               }
+       } else if (reformat_type == DR_ACTION_TYP_REMOVE_HDR) {
+               if (data ||
+                   MLX5_CAP_GEN_2(dmn->mdev, max_reformat_remove_size) < data_sz ||
+                   MLX5_CAP_GEN_2(dmn->mdev, max_reformat_remove_offset) < reformat_param_1) {
+                       mlx5dr_dbg(dmn, "Invalid reformat parameters for REMOVE_HDR\n");
+                       goto out_err;
+               }
+       } else if (reformat_param_0 || reformat_param_1 ||
+                  reformat_type > DR_ACTION_TYP_REMOVE_HDR) {
+               mlx5dr_dbg(dmn, "Invalid reformat parameters\n");
                goto out_err;
        }
 
                return 0;
        }
        case DR_ACTION_TYP_INSERT_HDR:
-       {
                ret = mlx5dr_cmd_create_reformat_ctx(dmn->mdev,
                                                     MLX5_REFORMAT_TYPE_INSERT_HDR,
                                                     reformat_param_0,
                action->reformat->param_0 = reformat_param_0;
                action->reformat->param_1 = reformat_param_1;
                return 0;
-       }
+       case DR_ACTION_TYP_REMOVE_HDR:
+               action->reformat->id = 0;
+               action->reformat->size = data_sz;
+               action->reformat->param_0 = reformat_param_0;
+               action->reformat->param_1 = reformat_param_1;
+               return 0;
        default:
                mlx5dr_info(dmn, "Reformat type is not supported %d\n", action->action_type);
                return -EINVAL;
                }
                break;
        case DR_ACTION_TYP_TNL_L2_TO_L2:
+       case DR_ACTION_TYP_REMOVE_HDR:
                refcount_dec(&action->reformat->dmn->refcount);
                break;
        case DR_ACTION_TYP_TNL_L3_TO_L2:
 
        dr_ste_v1_set_reparse(hw_ste_p);
 }
 
+static void dr_ste_v1_set_remove_hdr(u8 *hw_ste_p, u8 *s_action,
+                                    u8 anchor, u8 offset,
+                                    int size)
+{
+       MLX5_SET(ste_single_action_remove_header_size_v1, s_action,
+                action_id, DR_STE_V1_ACTION_ID_REMOVE_BY_SIZE);
+       MLX5_SET(ste_single_action_remove_header_size_v1, s_action, start_anchor, anchor);
+
+       /* The hardware expects here size and offset in words (2 byte) */
+       MLX5_SET(ste_single_action_remove_header_size_v1, s_action, remove_size, size / 2);
+       MLX5_SET(ste_single_action_remove_header_size_v1, s_action, start_offset, offset / 2);
+
+       dr_ste_v1_set_reparse(hw_ste_p);
+}
+
 static void dr_ste_v1_set_tx_push_vlan(u8 *hw_ste_p, u8 *d_action,
                                       u32 vlan_hdr)
 {
                                         attr->reformat.size);
                action_sz -= DR_STE_ACTION_DOUBLE_SZ;
                action += DR_STE_ACTION_DOUBLE_SZ;
+       } else if (action_type_set[DR_ACTION_TYP_REMOVE_HDR]) {
+               if (action_sz < DR_STE_ACTION_SINGLE_SZ) {
+                       dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi);
+                       action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action);
+                       action_sz = DR_STE_ACTION_TRIPLE_SZ;
+               }
+               dr_ste_v1_set_remove_hdr(last_ste, action,
+                                        attr->reformat.param_0,
+                                        attr->reformat.param_1,
+                                        attr->reformat.size);
+               action_sz -= DR_STE_ACTION_SINGLE_SZ;
+               action += DR_STE_ACTION_SINGLE_SZ;
        }
 
        dr_ste_v1_set_hit_gvmi(last_ste, attr->hit_gvmi);
                action_sz -= DR_STE_ACTION_DOUBLE_SZ;
                action += DR_STE_ACTION_DOUBLE_SZ;
                allow_modify_hdr = false;
+       } else if (action_type_set[DR_ACTION_TYP_REMOVE_HDR]) {
+               if (action_sz < DR_STE_ACTION_SINGLE_SZ) {
+                       dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi);
+                       action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action);
+                       action_sz = DR_STE_ACTION_TRIPLE_SZ;
+                       allow_modify_hdr = true;
+                       allow_ctr = true;
+               }
+               dr_ste_v1_set_remove_hdr(last_ste, action,
+                                        attr->reformat.param_0,
+                                        attr->reformat.param_1,
+                                        attr->reformat.size);
+               action_sz -= DR_STE_ACTION_SINGLE_SZ;
+               action += DR_STE_ACTION_SINGLE_SZ;
        }
 
        dr_ste_v1_set_hit_gvmi(last_ste, attr->hit_gvmi);