struct mlx5dr_ste_actions_attr *attr,
                               u32 *added_stes)
 {
-       ste_ctx->set_actions_tx(dmn, action_type_set, hw_ste_arr,
-                               attr, added_stes);
+       ste_ctx->set_actions_tx(dmn, action_type_set, ste_ctx->actions_caps,
+                               hw_ste_arr, attr, added_stes);
 }
 
 void mlx5dr_ste_set_actions_rx(struct mlx5dr_ste_ctx *ste_ctx,
                               struct mlx5dr_ste_actions_attr *attr,
                               u32 *added_stes)
 {
-       ste_ctx->set_actions_rx(dmn, action_type_set, hw_ste_arr,
-                               attr, added_stes);
+       ste_ctx->set_actions_rx(dmn, action_type_set, ste_ctx->actions_caps,
+                               hw_ste_arr, attr, added_stes);
 }
 
 const struct mlx5dr_ste_action_modify_field *
        ste_ctx->build_tnl_header_0_1_init(sb, mask);
 }
 
-static struct mlx5dr_ste_ctx *mlx5dr_ste_ctx_arr[] = {
-       [MLX5_STEERING_FORMAT_CONNECTX_5] = &ste_ctx_v0,
-       [MLX5_STEERING_FORMAT_CONNECTX_6DX] = &ste_ctx_v1,
-};
-
 struct mlx5dr_ste_ctx *mlx5dr_ste_get_ctx(u8 version)
 {
-       if (version > MLX5_STEERING_FORMAT_CONNECTX_6DX)
-               return NULL;
+       if (version == MLX5_STEERING_FORMAT_CONNECTX_5)
+               return mlx5dr_ste_get_ctx_v0();
+       else if (version == MLX5_STEERING_FORMAT_CONNECTX_6DX)
+               return mlx5dr_ste_get_ctx_v1();
 
-       return mlx5dr_ste_ctx_arr[version];
+       return NULL;
 }
 
        u32 actions_caps;
        void (*set_actions_rx)(struct mlx5dr_domain *dmn,
                               u8 *action_type_set,
+                              u32 actions_caps,
                               u8 *hw_ste_arr,
                               struct mlx5dr_ste_actions_attr *attr,
                               u32 *added_stes);
        void (*set_actions_tx)(struct mlx5dr_domain *dmn,
                               u8 *action_type_set,
+                              u32 actions_caps,
                               u8 *hw_ste_arr,
                               struct mlx5dr_ste_actions_attr *attr,
                               u32 *added_stes);
        void (*prepare_for_postsend)(u8 *hw_ste_p, u32 ste_size);
 };
 
-extern struct mlx5dr_ste_ctx ste_ctx_v0;
-extern struct mlx5dr_ste_ctx ste_ctx_v1;
+struct mlx5dr_ste_ctx *mlx5dr_ste_get_ctx_v0(void);
+struct mlx5dr_ste_ctx *mlx5dr_ste_get_ctx_v1(void);
 
 #endif  /* _DR_STE_ */
 
 static void
 dr_ste_v0_set_actions_tx(struct mlx5dr_domain *dmn,
                         u8 *action_type_set,
+                        u32 actions_caps,
                         u8 *last_ste,
                         struct mlx5dr_ste_actions_attr *attr,
                         u32 *added_stes)
 static void
 dr_ste_v0_set_actions_rx(struct mlx5dr_domain *dmn,
                         u8 *action_type_set,
+                        u32 actions_caps,
                         u8 *last_ste,
                         struct mlx5dr_ste_actions_attr *attr,
                         u32 *added_stes)
        sb->ste_build_tag_func = &dr_ste_v0_build_tnl_header_0_1_tag;
 }
 
-struct mlx5dr_ste_ctx ste_ctx_v0 = {
+static struct mlx5dr_ste_ctx ste_ctx_v0 = {
        /* Builders */
        .build_eth_l2_src_dst_init      = &dr_ste_v0_build_eth_l2_src_dst_init,
        .build_eth_l3_ipv6_src_init     = &dr_ste_v0_build_eth_l3_ipv6_src_init,
        .set_action_copy                = &dr_ste_v0_set_action_copy,
        .set_action_decap_l3_list       = &dr_ste_v0_set_action_decap_l3_list,
 };
+
+struct mlx5dr_ste_ctx *mlx5dr_ste_get_ctx_v0(void)
+{
+       return &ste_ctx_v0;
+}
 
 
 static void dr_ste_v1_set_actions_tx(struct mlx5dr_domain *dmn,
                                     u8 *action_type_set,
+                                    u32 actions_caps,
                                     u8 *last_ste,
                                     struct mlx5dr_ste_actions_attr *attr,
                                     u32 *added_stes)
                dr_ste_v1_set_pop_vlan(last_ste, action, attr->vlans.count);
                action_sz -= DR_STE_ACTION_SINGLE_SZ;
                action += DR_STE_ACTION_SINGLE_SZ;
+
+               /* Check if vlan_pop and modify_hdr on same STE is supported */
+               if (!(actions_caps & DR_STE_CTX_ACTION_CAP_POP_MDFY))
+                       allow_modify_hdr = false;
        }
 
        if (action_type_set[DR_ACTION_TYP_CTR])
 
 static void dr_ste_v1_set_actions_rx(struct mlx5dr_domain *dmn,
                                     u8 *action_type_set,
+                                    u32 actions_caps,
                                     u8 *last_ste,
                                     struct mlx5dr_ste_actions_attr *attr,
                                     u32 *added_stes)
                action_sz -= DR_STE_ACTION_SINGLE_SZ;
                action += DR_STE_ACTION_SINGLE_SZ;
                allow_ctr = false;
+
+               /* Check if vlan_pop and modify_hdr on same STE is supported */
+               if (!(actions_caps & DR_STE_CTX_ACTION_CAP_POP_MDFY))
+                       allow_modify_hdr = false;
        }
 
        if (action_type_set[DR_ACTION_TYP_MODIFY_HDR]) {
        sb->ste_build_tag_func = &dr_ste_v1_build_tnl_gtpu_flex_parser_1_tag;
 }
 
-struct mlx5dr_ste_ctx ste_ctx_v1 = {
+static struct mlx5dr_ste_ctx ste_ctx_v1 = {
        /* Builders */
        .build_eth_l2_src_dst_init      = &dr_ste_v1_build_eth_l2_src_dst_init,
        .build_eth_l3_ipv6_src_init     = &dr_ste_v1_build_eth_l3_ipv6_src_init,
        /* Actions */
        .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_RX_ENCAP |
+                                         DR_STE_CTX_ACTION_CAP_POP_MDFY,
        .set_actions_rx                 = &dr_ste_v1_set_actions_rx,
        .set_actions_tx                 = &dr_ste_v1_set_actions_tx,
        .modify_field_arr_sz            = ARRAY_SIZE(dr_ste_v1_action_modify_field_arr),
        /* Send */
        .prepare_for_postsend           = &dr_ste_v1_prepare_for_postsend,
 };
+
+struct mlx5dr_ste_ctx *mlx5dr_ste_get_ctx_v1(void)
+{
+       return &ste_ctx_v1;
+}
 
        DR_STE_CTX_ACTION_CAP_TX_POP   = 1 << 0,
        DR_STE_CTX_ACTION_CAP_RX_PUSH  = 1 << 1,
        DR_STE_CTX_ACTION_CAP_RX_ENCAP = 1 << 2,
+       DR_STE_CTX_ACTION_CAP_POP_MDFY = 1 << 3,
 };
 
 enum {