initial drop of phosphor-ipmi-blobs
This implements a majority of the OEM IPMI BLOBS protocol. The only
piece missing from this is the timed expiration of sessions.
Change-Id: I82c9d17b625c94fc3340edcfabbbf1ffeb5ad7ac
Signed-off-by: Patrick Venture <venture@google.com>
diff --git a/blobs.hpp b/blobs.hpp
new file mode 100644
index 0000000..b6672b7
--- /dev/null
+++ b/blobs.hpp
@@ -0,0 +1,143 @@
+#pragma once
+
+#include <string>
+#include <vector>
+
+namespace blobs
+{
+
+enum OpenFlags
+{
+ read = (1 << 0),
+ write = (1 << 1),
+ /* bits 3-7 reserved. */
+ /* bits 8-15 given blob-specific definitions */
+};
+
+enum StateFlags
+{
+ open_read = (1 << 0),
+ open_write = (1 << 1),
+ committing = (1 << 2),
+ committed = (1 << 3),
+ commit_error = (1 << 4),
+};
+
+struct BlobMeta
+{
+ uint16_t blobState;
+ uint32_t size;
+ std::vector<uint8_t> metadata;
+};
+
+/*
+ * All blob specific objects implement this interface.
+ */
+class GenericBlobInterface
+{
+ public:
+ virtual ~GenericBlobInterface() = default;
+
+ /**
+ * Checks if the handler will manage this file path.
+ *
+ * @param[in] blobId.
+ * @return bool whether it will manage the file path.
+ */
+ virtual bool canHandleBlob(const std::string& path) = 0;
+
+ /**
+ * Return the name(s) of the blob(s). Used during GetCount.
+ *
+ * @return List of blobIds this handler manages.
+ */
+ virtual std::vector<std::string> getBlobIds() = 0;
+
+ /**
+ * Attempt to delete the blob specified by the path.
+ *
+ * @param[in] path - the blobId to try and delete.
+ * @return bool - whether it was able to delete the blob.
+ */
+ virtual bool deleteBlob(const std::string& path) = 0;
+
+ /**
+ * Return metadata about the blob.
+ *
+ * @param[in] path - the blobId for metadata.
+ * @param[in,out] meta - a pointer to a blobmeta.
+ * @return bool - true if it was successful.
+ */
+ virtual bool stat(const std::string& path, struct BlobMeta* meta) = 0;
+
+ /* The methods below are per session. */
+
+ /**
+ * Attempt to open a session from this path.
+ *
+ * @param[in] session - the session id.
+ * @param[in] flags - the open flags.
+ * @param[in] path - the blob path.
+ * @return bool - was able to open the session.
+ */
+ virtual bool open(uint16_t session, uint16_t flags,
+ const std::string& path) = 0;
+
+ /**
+ * Attempt to read from a blob.
+ *
+ * @param[in] session - the session id.
+ * @param[in] offset - offset into the blob.
+ * @param[in] requestedSize - number of bytes to read.
+ * @return Bytes read back (0 length on error).
+ */
+ virtual std::vector<uint8_t> read(uint16_t session, uint32_t offset,
+ uint32_t requestedSize) = 0;
+
+ /**
+ * Attempt to write to a blob.
+ *
+ * @param[in] session - the session id.
+ * @param[in] offset - offset into the blob.
+ * @param[in] data - the data to write.
+ * @return bool - was able to write.
+ */
+ virtual bool write(uint16_t session, uint32_t offset,
+ const std::vector<uint8_t>& data) = 0;
+
+ /**
+ * Attempt to commit to a blob.
+ *
+ * @param[in] session - the session id.
+ * @param[in] data - optional commit data.
+ * @return bool - was able to start commit.
+ */
+ virtual bool commit(uint16_t session, const std::vector<uint8_t>& data) = 0;
+
+ /**
+ * Attempt to close your session.
+ *
+ * @param[in] session - the session id.
+ * @return bool - was able to close session.
+ */
+ virtual bool close(uint16_t session) = 0;
+
+ /**
+ * Attempt to return metadata for the session's view of the blob.
+ *
+ * @param[in] session - the session id.
+ * @param[in,out] meta - pointer to update with the BlobMeta.
+ * @return bool - wether it was successful.
+ */
+ virtual bool stat(uint16_t session, struct BlobMeta* meta) = 0;
+
+ /**
+ * Attempt to expire a session. This is called when a session has been
+ * inactive for at least 10 minutes.
+ *
+ * @param[in] session - the session id.
+ * @return bool - whether the session was able to be closed.
+ */
+ virtual bool expire(uint16_t session) = 0;
+};
+} // namespace blobs