blob: f73065cd5747e114e0d0afb2634deff737e68606 [file] [log] [blame]
#pragma once
#include "manager.hpp"
#include <ipmid/api.h>
#include <blobs-ipmid/blobs.hpp>
#include <ipmid/api-types.hpp>
#include <span>
#include <string>
#include <vector>
namespace blobs
{
using Resp = ipmi::RspType<std::vector<uint8_t>>;
/* Used by bmcBlobGetCount */
struct BmcBlobCountTx
{
} __attribute__((packed));
struct BmcBlobCountRx
{
uint16_t crc;
uint32_t blobCount;
} __attribute__((packed));
/* Used by bmcBlobEnumerate */
struct BmcBlobEnumerateTx
{
uint16_t crc;
uint32_t blobIdx;
} __attribute__((packed));
struct BmcBlobEnumerateRx
{
uint16_t crc;
} __attribute__((packed));
/* Used by bmcBlobOpen */
struct BmcBlobOpenTx
{
uint16_t crc;
uint16_t flags;
} __attribute__((packed));
struct BmcBlobOpenRx
{
uint16_t crc;
uint16_t sessionId;
} __attribute__((packed));
/* Used by bmcBlobClose */
struct BmcBlobCloseTx
{
uint16_t crc;
uint16_t sessionId; /* Returned from BmcBlobOpen. */
} __attribute__((packed));
/* Used by bmcBlobDelete */
struct BmcBlobDeleteTx
{
uint16_t crc;
} __attribute__((packed));
/* Used by bmcBlobStat */
struct BmcBlobStatTx
{
uint16_t crc;
} __attribute__((packed));
struct BmcBlobStatRx
{
uint16_t crc;
uint16_t blobState;
uint32_t size; /* Size in bytes of the blob. */
uint8_t metadataLen;
} __attribute__((packed));
/* Used by bmcBlobSessionStat */
struct BmcBlobSessionStatTx
{
uint16_t crc;
uint16_t sessionId;
} __attribute__((packed));
/* Used by bmcBlobCommit */
struct BmcBlobCommitTx
{
uint16_t crc;
uint16_t sessionId;
uint8_t commitDataLen;
} __attribute__((packed));
/* Used by bmcBlobRead */
struct BmcBlobReadTx
{
uint16_t crc;
uint16_t sessionId;
uint32_t offset; /* The byte sequence start, 0-based. */
uint32_t requestedSize; /* The number of bytes requested for reading. */
} __attribute__((packed));
struct BmcBlobReadRx
{
uint16_t crc;
} __attribute__((packed));
/* Used by bmcBlobWrite */
struct BmcBlobWriteTx
{
uint16_t crc;
uint16_t sessionId;
uint32_t offset; /* The byte sequence start, 0-based. */
} __attribute__((packed));
/* Used by bmcBlobWriteMeta */
struct BmcBlobWriteMetaTx
{
uint16_t crc;
uint16_t sessionId; /* Returned from BmcBlobOpen. */
uint32_t offset; /* The byte sequence start, 0-based. */
} __attribute__((packed));
/**
* Validate the minimum request length if there is one.
*
* @param[in] subcommand - the command
* @param[in] requestLength - the length of the request
* @return bool - true if valid.
*/
bool validateRequestLength(BlobOEMCommands command, size_t requestLen);
/**
* Given a pointer into an IPMI request buffer and the length of the remaining
* buffer, builds a string. This does no string validation w.r.t content.
*
* @param[in] data - Buffer containing the string.
* @return the string if valid otherwise an empty string.
*/
std::string stringFromBuffer(std::span<const uint8_t> data);
/**
* Writes out a BmcBlobCountRx structure and returns IPMI_OK.
*/
Resp getBlobCount(ManagerInterface* mgr, std::span<const uint8_t> data);
/**
* Writes out a BmcBlobEnumerateRx in response to a BmcBlobEnumerateTx
* request. If the index does not correspond to a blob, then this will
* return failure.
*
* It will also return failure if the response buffer is of an invalid
* length.
*/
Resp enumerateBlob(ManagerInterface* mgr, std::span<const uint8_t> data);
/**
* Attempts to open the blobId specified and associate with a session id.
*/
Resp openBlob(ManagerInterface* mgr, std::span<const uint8_t> data);
/**
* Attempts to close the session specified.
*/
Resp closeBlob(ManagerInterface* mgr, std::span<const uint8_t> data);
/**
* Attempts to delete the blobId specified.
*/
Resp deleteBlob(ManagerInterface* mgr, std::span<const uint8_t> data);
/**
* Attempts to retrieve the Stat for the blobId specified.
*/
Resp statBlob(ManagerInterface* mgr, std::span<const uint8_t> data);
/**
* Attempts to retrieve the Stat for the session specified.
*/
Resp sessionStatBlob(ManagerInterface* mgr, std::span<const uint8_t> data);
/**
* Attempts to commit the data in the blob.
*/
Resp commitBlob(ManagerInterface* mgr, std::span<const uint8_t> data);
/**
* Attempt to read data from the blob.
*/
Resp readBlob(ManagerInterface* mgr, std::span<const uint8_t> data);
/**
* Attempt to write data to the blob.
*/
Resp writeBlob(ManagerInterface* mgr, std::span<const uint8_t> data);
/**
* Attempt to write metadata to the blob.
*/
Resp writeMeta(ManagerInterface* mgr, std::span<const uint8_t> data);
} // namespace blobs