| // Copyright 2021 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef TRUNKS_CSME_MEI_CLIENT_FACTORY_H_ |
| #define TRUNKS_CSME_MEI_CLIENT_FACTORY_H_ |
| |
| #include <array> |
| #include <memory> |
| #include <string> |
| |
| #include <linux/uuid.h> |
| |
| #include "trunks/csme/mei_client.h" |
| #include "trunks/trunks_export.h" |
| |
| namespace trunks { |
| namespace csme { |
| |
| // `MeiClientFactory` creates `MeiClient` with the type selected according to |
| // the confguration setup. See `mei_selection.md` for more information. |
| class TRUNKS_EXPORT MeiClientFactory { |
| public: |
| // Constructs the factory with the customized socket config path and character |
| // device path. |
| MeiClientFactory(const std::string& socket_config_path, |
| const std::string& char_device_path); |
| MeiClientFactory(); |
| ~MeiClientFactory() = default; |
| |
| MeiClientFactory(MeiClientFactory&&) = delete; |
| MeiClientFactory& operator=(MeiClientFactory&&) = delete; |
| |
| // The following group of factory functions creates the instances of |
| // `MeiClient` with corresponding MEI GUIDs and the connection type |
| // configuration. |
| // |
| // Creates an `MeiClient` instance for pinweaver core. |
| std::unique_ptr<MeiClient> CreateMeiClientForPinWeaverCore(); |
| // Creates an `MeiClient` instance for pinweaver provision. |
| std::unique_ptr<MeiClient> CreateMeiClientForPinWeaverProvision(); |
| // Creates an `MeiClient` instance for pinweaver tpm tunnel. |
| std::unique_ptr<MeiClient> CreateMeiClientForPinWeaverTpmTunnel(); |
| |
| private: |
| std::unique_ptr<MeiClient> CreateMeiClient(const std::string path, |
| const uuid_le& guid); |
| |
| // The ways connecting to MEI. |
| enum class MeiConnectionType { |
| // Not determined yet. |
| kUnknown, |
| // Character device driver; typically it means /dev/mei0. |
| kCharacterDevice, |
| // Sokcet-based connection. Used for emulator case. |
| kSocket, |
| }; |
| |
| void DetermineMeiConnectionType(); |
| MeiConnectionType GetMeiConnectionType(); |
| bool ReadSocketConfig(); |
| |
| // The function type of MEI clients. |
| enum class MeiFunctionType { |
| kCore = 0, |
| kProvision = 1, |
| kTpmTunnel = 2, |
| kSize = 3, |
| }; |
| |
| std::string GetMeiPath(MeiFunctionType function_type); |
| std::string GetCoreMeiPath(); |
| std::string GetProvisionMeiPath(); |
| std::string GetTpmTunnelMeiPath(); |
| |
| const std::string socket_config_path_; |
| const std::string char_device_path_; |
| std::array<std::string, static_cast<int>(MeiFunctionType::kSize)> |
| socket_paths_; |
| MeiConnectionType mei_client_type_ = MeiConnectionType::kUnknown; |
| }; |
| |
| } // namespace csme |
| } // namespace trunks |
| |
| #endif // TRUNKS_CSME_MEI_CLIENT_FACTORY_H_ |