Patrick Venture | c7ca291 | 2018-11-02 11:38:33 -0700 | [diff] [blame] | 1 | #pragma once |
| 2 | |
Patrick Venture | a78e39f | 2018-11-06 18:37:06 -0800 | [diff] [blame] | 3 | #include "image_handler.hpp" |
| 4 | |
Patrick Venture | c7ca291 | 2018-11-02 11:38:33 -0700 | [diff] [blame] | 5 | #include <blobs-ipmid/blobs.hpp> |
Patrick Venture | 192d60f | 2018-11-06 11:11:59 -0800 | [diff] [blame] | 6 | #include <cstdint> |
Patrick Venture | 68cf64f | 2018-11-06 10:46:51 -0800 | [diff] [blame] | 7 | #include <memory> |
Patrick Venture | 148cd65 | 2018-11-06 10:59:47 -0800 | [diff] [blame] | 8 | #include <string> |
| 9 | #include <vector> |
Patrick Venture | c7ca291 | 2018-11-02 11:38:33 -0700 | [diff] [blame] | 10 | |
| 11 | namespace blobs |
| 12 | { |
| 13 | |
Patrick Venture | c7ca291 | 2018-11-02 11:38:33 -0700 | [diff] [blame] | 14 | /** |
| 15 | * Register only one firmware blob handler that will manage all sessions. |
| 16 | */ |
| 17 | class FirmwareBlobHandler : public GenericBlobInterface |
| 18 | { |
| 19 | public: |
Patrick Venture | fc3857b | 2018-11-07 08:14:55 -0800 | [diff] [blame^] | 20 | enum FirmwareUpdateFlags : std::uint16_t |
| 21 | { |
| 22 | bt = (1 << 8), /* Expect to send contents over IPMI BlockTransfer. */ |
| 23 | p2a = (1 << 9), /* Expect to send contents over P2A bridge. */ |
| 24 | lpc = (1 << 10), /* Expect to send contents over LPC bridge. */ |
| 25 | }; |
| 26 | |
Patrick Venture | 137ad2c | 2018-11-06 11:30:43 -0800 | [diff] [blame] | 27 | /** |
| 28 | * Create a FirmwareBlobHandler. |
| 29 | * |
Patrick Venture | 4cceb8e | 2018-11-06 11:56:48 -0800 | [diff] [blame] | 30 | * @param[in] firmwares - list of firmware blob_ids to support. |
Patrick Venture | 137ad2c | 2018-11-06 11:30:43 -0800 | [diff] [blame] | 31 | * @param[in] transports - bitmask of transports to support. |
| 32 | */ |
Patrick Venture | 148cd65 | 2018-11-06 10:59:47 -0800 | [diff] [blame] | 33 | static std::unique_ptr<GenericBlobInterface> |
Patrick Venture | a78e39f | 2018-11-06 18:37:06 -0800 | [diff] [blame] | 34 | CreateFirmwareBlobHandler(const std::vector<HandlerPack>& firmwares, |
Patrick Venture | 46637c8 | 2018-11-06 15:20:24 -0800 | [diff] [blame] | 35 | std::uint16_t transports); |
Patrick Venture | 68cf64f | 2018-11-06 10:46:51 -0800 | [diff] [blame] | 36 | |
Patrick Venture | 137ad2c | 2018-11-06 11:30:43 -0800 | [diff] [blame] | 37 | /** |
| 38 | * Create a FirmwareBlobHandler. |
| 39 | * |
Patrick Venture | a78e39f | 2018-11-06 18:37:06 -0800 | [diff] [blame] | 40 | * @param[in] blobs - list of blobs_ids to support and their image handlers. |
Patrick Venture | 137ad2c | 2018-11-06 11:30:43 -0800 | [diff] [blame] | 41 | * @param[in] transports - bitmask of transports to support. |
| 42 | */ |
Patrick Venture | a78e39f | 2018-11-06 18:37:06 -0800 | [diff] [blame] | 43 | FirmwareBlobHandler(const std::vector<HandlerPack>& firmwares, |
| 44 | const std::vector<std::string>& blobs, |
Patrick Venture | 46637c8 | 2018-11-06 15:20:24 -0800 | [diff] [blame] | 45 | std::uint16_t transports) : |
Patrick Venture | a78e39f | 2018-11-06 18:37:06 -0800 | [diff] [blame] | 46 | handlers(firmwares), |
| 47 | blobIDs(blobs), transports(transports) |
Patrick Venture | 148cd65 | 2018-11-06 10:59:47 -0800 | [diff] [blame] | 48 | { |
| 49 | } |
Patrick Venture | c7ca291 | 2018-11-02 11:38:33 -0700 | [diff] [blame] | 50 | ~FirmwareBlobHandler() = default; |
| 51 | FirmwareBlobHandler(const FirmwareBlobHandler&) = default; |
| 52 | FirmwareBlobHandler& operator=(const FirmwareBlobHandler&) = default; |
| 53 | FirmwareBlobHandler(FirmwareBlobHandler&&) = default; |
| 54 | FirmwareBlobHandler& operator=(FirmwareBlobHandler&&) = default; |
| 55 | |
| 56 | bool canHandleBlob(const std::string& path) override; |
| 57 | std::vector<std::string> getBlobIds() override; |
| 58 | bool deleteBlob(const std::string& path) override; |
| 59 | bool stat(const std::string& path, struct BlobMeta* meta) override; |
| 60 | bool open(uint16_t session, uint16_t flags, |
| 61 | const std::string& path) override; |
| 62 | std::vector<uint8_t> read(uint16_t session, uint32_t offset, |
| 63 | uint32_t requestedSize) override; |
| 64 | bool write(uint16_t session, uint32_t offset, |
| 65 | const std::vector<uint8_t>& data) override; |
| 66 | bool writeMeta(uint16_t session, uint32_t offset, |
| 67 | const std::vector<uint8_t>& data) override; |
| 68 | bool commit(uint16_t session, const std::vector<uint8_t>& data) override; |
| 69 | bool close(uint16_t session) override; |
| 70 | bool stat(uint16_t session, struct BlobMeta* meta) override; |
| 71 | bool expire(uint16_t session) override; |
Patrick Venture | 148cd65 | 2018-11-06 10:59:47 -0800 | [diff] [blame] | 72 | |
Patrick Venture | 21be45a | 2018-11-06 12:08:52 -0800 | [diff] [blame] | 73 | static const std::string hashBlobID; |
Patrick Venture | 7b9256f | 2018-11-06 15:06:04 -0800 | [diff] [blame] | 74 | static const std::string activeImageBlobID; |
| 75 | static const std::string activeHashBlobID; |
Patrick Venture | 21be45a | 2018-11-06 12:08:52 -0800 | [diff] [blame] | 76 | |
Patrick Venture | 148cd65 | 2018-11-06 10:59:47 -0800 | [diff] [blame] | 77 | private: |
Patrick Venture | a78e39f | 2018-11-06 18:37:06 -0800 | [diff] [blame] | 78 | /** List of handlers by type. */ |
| 79 | std::vector<HandlerPack> handlers; |
| 80 | |
Patrick Venture | c02849b | 2018-11-06 17:31:15 -0800 | [diff] [blame] | 81 | /** Active list of blobIDs. */ |
Patrick Venture | 4cceb8e | 2018-11-06 11:56:48 -0800 | [diff] [blame] | 82 | std::vector<std::string> blobIDs; |
Patrick Venture | c02849b | 2018-11-06 17:31:15 -0800 | [diff] [blame] | 83 | |
| 84 | /** The bits set indicate what transport mechanisms are supported. */ |
Patrick Venture | 46637c8 | 2018-11-06 15:20:24 -0800 | [diff] [blame] | 85 | std::uint16_t transports; |
Patrick Venture | c02849b | 2018-11-06 17:31:15 -0800 | [diff] [blame] | 86 | |
| 87 | /** Temporary variable to track whether a blob is open. */ |
| 88 | bool fileOpen = false; |
Patrick Venture | c7ca291 | 2018-11-02 11:38:33 -0700 | [diff] [blame] | 89 | }; |
| 90 | |
| 91 | } // namespace blobs |