static int dr_table_create_sw_owned_tbl(struct mlx5dr_table *tbl)
 {
+       bool en_encap = !!(tbl->flags & MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT);
+       bool en_decap = !!(tbl->flags & MLX5_FLOW_TABLE_TUNNEL_EN_DECAP);
        struct mlx5dr_cmd_create_flow_table_attr ft_attr = {};
        u64 icm_addr_rx = 0;
        u64 icm_addr_tx = 0;
        ft_attr.icm_addr_tx = icm_addr_tx;
        ft_attr.level = tbl->dmn->info.caps.max_ft_level - 1;
        ft_attr.sw_owner = true;
+       ft_attr.decap_en = en_decap;
+       ft_attr.reformat_en = en_encap;
 
        ret = mlx5dr_cmd_create_flow_table(tbl->dmn->mdev, &ft_attr,
                                           NULL, &tbl->table_id);
        return ret;
 }
 
-struct mlx5dr_table *mlx5dr_table_create(struct mlx5dr_domain *dmn, u32 level)
+struct mlx5dr_table *mlx5dr_table_create(struct mlx5dr_domain *dmn, u32 level, u32 flags)
 {
        struct mlx5dr_table *tbl;
        int ret;
 
        tbl->dmn = dmn;
        tbl->level = level;
+       tbl->flags = flags;
        refcount_set(&tbl->refcount, 1);
 
        ret = dr_table_init(tbl);
 
                            struct mlx5dr_domain *peer_dmn);
 
 struct mlx5dr_table *
-mlx5dr_table_create(struct mlx5dr_domain *domain, u32 level);
+mlx5dr_table_create(struct mlx5dr_domain *domain, u32 level, u32 flags);
 
 int mlx5dr_table_destroy(struct mlx5dr_table *table);
 
                       struct mlx5dr_domain *peer_dmn) { }
 
 static inline struct mlx5dr_table *
-mlx5dr_table_create(struct mlx5dr_domain *domain, u32 level) { return NULL; }
+mlx5dr_table_create(struct mlx5dr_domain *domain, u32 level, u32 flags) { return NULL; }
 
 static inline int
 mlx5dr_table_destroy(struct mlx5dr_table *table) { return 0; }