blob: 4dcbfb877b48803d4cc603e4044ee6ef6045ccae [file] [log] [blame]
Patrick Venturec7ca2912018-11-02 11:38:33 -07001#pragma once
2
Patrick Venture1cde5f92018-11-07 08:26:47 -08003#include "data_handler.hpp"
Patrick Venturea78e39f2018-11-06 18:37:06 -08004#include "image_handler.hpp"
5
Patrick Venturec7ca2912018-11-02 11:38:33 -07006#include <blobs-ipmid/blobs.hpp>
Patrick Venture192d60f2018-11-06 11:11:59 -08007#include <cstdint>
Patrick Ventured9fb6132018-11-08 09:56:10 -08008#include <map>
Patrick Venture68cf64f2018-11-06 10:46:51 -08009#include <memory>
Patrick Venture148cd652018-11-06 10:59:47 -080010#include <string>
11#include <vector>
Patrick Venturec7ca2912018-11-02 11:38:33 -070012
13namespace blobs
14{
15
Patrick Venturec7ca2912018-11-02 11:38:33 -070016/**
Patrick Venture2d3a2542018-11-08 09:23:24 -080017 * Representation of a session, includes how to read/write data.
18 */
19struct Session
20{
21 /** Pointer to the correct Data handler interface. (nullptr on BT (or KCS))
22 */
23 DataInterface* dataHandler;
24
25 /** Pointer to the correct image handler interface. (nullptr on hash
26 * blob_id) */
27 ImageHandlerInterface* imageHandler;
Patrick Venture18235e62018-11-08 10:21:09 -080028
29 /** The flags used to open the session. */
30 std::uint16_t flags;
Patrick Venture2d3a2542018-11-08 09:23:24 -080031};
32
Patrick Venture18235e62018-11-08 10:21:09 -080033struct ExtChunkHdr
34{
35 std::uint32_t length; /* Length of the data queued (little endian). */
36} __attribute__((packed));
37
Patrick Venture2d3a2542018-11-08 09:23:24 -080038/**
Patrick Venturec7ca2912018-11-02 11:38:33 -070039 * Register only one firmware blob handler that will manage all sessions.
40 */
41class FirmwareBlobHandler : public GenericBlobInterface
42{
43 public:
Patrick Venturefc3857b2018-11-07 08:14:55 -080044 enum FirmwareUpdateFlags : std::uint16_t
45 {
Patrick Venture9158dcf2018-11-08 09:44:28 -080046 ipmi = (1 << 8), /* Expect to send contents over IPMI BlockTransfer. */
Patrick Venturefc3857b2018-11-07 08:14:55 -080047 p2a = (1 << 9), /* Expect to send contents over P2A bridge. */
48 lpc = (1 << 10), /* Expect to send contents over LPC bridge. */
49 };
50
Patrick Venture137ad2c2018-11-06 11:30:43 -080051 /**
52 * Create a FirmwareBlobHandler.
53 *
Patrick Venture4cceb8e2018-11-06 11:56:48 -080054 * @param[in] firmwares - list of firmware blob_ids to support.
Patrick Venture1cde5f92018-11-07 08:26:47 -080055 * @param[in] transports - list of transports to support.
Patrick Venture137ad2c2018-11-06 11:30:43 -080056 */
Patrick Venture1cde5f92018-11-07 08:26:47 -080057 static std::unique_ptr<GenericBlobInterface> CreateFirmwareBlobHandler(
58 const std::vector<HandlerPack>& firmwares,
59 const std::vector<DataHandlerPack>& transports);
Patrick Venture68cf64f2018-11-06 10:46:51 -080060
Patrick Venture137ad2c2018-11-06 11:30:43 -080061 /**
62 * Create a FirmwareBlobHandler.
63 *
Patrick Venture1cde5f92018-11-07 08:26:47 -080064 * @param[in] firmwares - list of firmware types and their handlers
65 * @param[in] blobs - list of blobs_ids to support
66 * @param[in] transports - list of transport types and their handlers
67 * @param[in] bitmask - bitmask of transports to support
Patrick Venture137ad2c2018-11-06 11:30:43 -080068 */
Patrick Venturea78e39f2018-11-06 18:37:06 -080069 FirmwareBlobHandler(const std::vector<HandlerPack>& firmwares,
70 const std::vector<std::string>& blobs,
Patrick Venture1cde5f92018-11-07 08:26:47 -080071 const std::vector<DataHandlerPack>& transports,
72 std::uint16_t bitmask) :
Patrick Venturea78e39f2018-11-06 18:37:06 -080073 handlers(firmwares),
Patrick Ventured9fb6132018-11-08 09:56:10 -080074 blobIDs(blobs), transports(transports), bitmask(bitmask), activeImage(),
75 activeHash(), lookup()
Patrick Venture148cd652018-11-06 10:59:47 -080076 {
77 }
Patrick Venturec7ca2912018-11-02 11:38:33 -070078 ~FirmwareBlobHandler() = default;
79 FirmwareBlobHandler(const FirmwareBlobHandler&) = default;
80 FirmwareBlobHandler& operator=(const FirmwareBlobHandler&) = default;
81 FirmwareBlobHandler(FirmwareBlobHandler&&) = default;
82 FirmwareBlobHandler& operator=(FirmwareBlobHandler&&) = default;
83
84 bool canHandleBlob(const std::string& path) override;
85 std::vector<std::string> getBlobIds() override;
86 bool deleteBlob(const std::string& path) override;
87 bool stat(const std::string& path, struct BlobMeta* meta) override;
88 bool open(uint16_t session, uint16_t flags,
89 const std::string& path) override;
90 std::vector<uint8_t> read(uint16_t session, uint32_t offset,
91 uint32_t requestedSize) override;
92 bool write(uint16_t session, uint32_t offset,
93 const std::vector<uint8_t>& data) override;
94 bool writeMeta(uint16_t session, uint32_t offset,
95 const std::vector<uint8_t>& data) override;
96 bool commit(uint16_t session, const std::vector<uint8_t>& data) override;
97 bool close(uint16_t session) override;
98 bool stat(uint16_t session, struct BlobMeta* meta) override;
99 bool expire(uint16_t session) override;
Patrick Venture148cd652018-11-06 10:59:47 -0800100
Patrick Venture21be45a2018-11-06 12:08:52 -0800101 static const std::string hashBlobID;
Patrick Venture7b9256f2018-11-06 15:06:04 -0800102 static const std::string activeImageBlobID;
103 static const std::string activeHashBlobID;
Patrick Venture21be45a2018-11-06 12:08:52 -0800104
Patrick Venture148cd652018-11-06 10:59:47 -0800105 private:
Patrick Venturea78e39f2018-11-06 18:37:06 -0800106 /** List of handlers by type. */
107 std::vector<HandlerPack> handlers;
108
Patrick Venturec02849b2018-11-06 17:31:15 -0800109 /** Active list of blobIDs. */
Patrick Venture4cceb8e2018-11-06 11:56:48 -0800110 std::vector<std::string> blobIDs;
Patrick Venturec02849b2018-11-06 17:31:15 -0800111
Patrick Venture1cde5f92018-11-07 08:26:47 -0800112 /** List of handlers by transport type. */
113 std::vector<DataHandlerPack> transports;
114
Patrick Venturec02849b2018-11-06 17:31:15 -0800115 /** The bits set indicate what transport mechanisms are supported. */
Patrick Venture1cde5f92018-11-07 08:26:47 -0800116 std::uint16_t bitmask;
Patrick Venturec02849b2018-11-06 17:31:15 -0800117
Patrick Ventured9fb6132018-11-08 09:56:10 -0800118 /** Active image session. */
119 Session activeImage;
120
121 /** Active hash session. */
122 Session activeHash;
123
124 /** A quick method for looking up a session's mechanisms and details. */
125 std::map<std::uint16_t, Session*> lookup;
126
Patrick Venturec02849b2018-11-06 17:31:15 -0800127 /** Temporary variable to track whether a blob is open. */
128 bool fileOpen = false;
Patrick Venturec7ca2912018-11-02 11:38:33 -0700129};
130
131} // namespace blobs