#pragma once #include #include #include namespace blobs { enum BlobOEMCommands { bmcBlobGetCount = 0, bmcBlobEnumerate = 1, bmcBlobOpen = 2, bmcBlobRead = 3, bmcBlobWrite = 4, bmcBlobCommit = 5, bmcBlobClose = 6, bmcBlobDelete = 7, bmcBlobStat = 8, bmcBlobSessionStat = 9, bmcBlobWriteMeta = 10, }; /* Used by bmcBlobGetCount */ struct BmcBlobCountTx { uint8_t cmd; /* bmcBlobGetCount */ } __attribute__((packed)); struct BmcBlobCountRx { uint16_t crc; uint32_t blobCount; } __attribute__((packed)); /* Used by bmcBlobEnumerate */ struct BmcBlobEnumerateTx { uint8_t cmd; /* bmcBlobEnumerate */ uint16_t crc; uint32_t blobIdx; } __attribute__((packed)); struct BmcBlobEnumerateRx { uint16_t crc; char blobId[]; } __attribute__((packed)); /* Used by bmcBlobOpen */ struct BmcBlobOpenTx { uint8_t cmd; /* bmcBlobOpen */ uint16_t crc; uint16_t flags; char blobId[]; /* Must correspond to a valid blob. */ } __attribute__((packed)); struct BmcBlobOpenRx { uint16_t crc; uint16_t sessionId; } __attribute__((packed)); /* Used by bmcBlobClose */ struct BmcBlobCloseTx { uint8_t cmd; /* bmcBlobClose */ uint16_t crc; uint16_t sessionId; /* Returned from BmcBlobOpen. */ } __attribute__((packed)); /* Used by bmcBlobDelete */ struct BmcBlobDeleteTx { uint8_t cmd; /* bmcBlobDelete */ uint16_t crc; char blobId[]; } __attribute__((packed)); /* Used by bmcBlobStat */ struct BmcBlobStatTx { uint8_t cmd; /* bmcBlobStat */ uint16_t crc; char blobId[]; } __attribute__((packed)); struct BmcBlobStatRx { uint16_t crc; uint16_t blobState; uint32_t size; /* Size in bytes of the blob. */ uint8_t metadataLen; uint8_t metadata[]; /* Optional blob-specific metadata. */ } __attribute__((packed)); /* Used by bmcBlobSessionStat */ struct BmcBlobSessionStatTx { uint8_t cmd; /* bmcBlobSessionStat */ uint16_t crc; uint16_t sessionId; } __attribute__((packed)); /* Used by bmcBlobCommit */ struct BmcBlobCommitTx { uint8_t cmd; /* bmcBlobCommit */ uint16_t crc; uint16_t sessionId; uint8_t commitDataLen; uint8_t commitData[]; /* Optional blob-specific commit data. */ } __attribute__((packed)); /* Used by bmcBlobRead */ struct BmcBlobReadTx { uint8_t cmd; /* bmcBlobRead */ 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; uint8_t data[]; } __attribute__((packed)); /* Used by bmcBlobWrite */ struct BmcBlobWriteTx { uint8_t cmd; /* bmcBlobWrite */ uint16_t crc; uint16_t sessionId; uint32_t offset; /* The byte sequence start, 0-based. */ uint8_t data[]; } __attribute__((packed)); /* Used by bmcBlobWriteMeta */ struct BmcBlobWriteMetaTx { uint8_t cmd; /* bmcBlobWriteMeta */ uint16_t crc; uint16_t sessionId; /* Returned from BmcBlobOpen. */ uint32_t offset; /* The byte sequence start, 0-based. */ uint8_t data[]; } __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] start - the start of the expected string. * @param[in] length - the number of bytes remaining in the buffer. * @return the string if valid otherwise an empty string. */ std::string stringFromBuffer(const char* start, size_t length); /** * Writes out a BmcBlobCountRx structure and returns IPMI_OK. */ ipmi_ret_t getBlobCount(ManagerInterface* mgr, const uint8_t* reqBuf, uint8_t* replyCmdBuf, size_t* dataLen); /** * 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. */ ipmi_ret_t enumerateBlob(ManagerInterface* mgr, const uint8_t* reqBuf, uint8_t* replyCmdBuf, size_t* dataLen); /** * Attempts to open the blobId specified and associate with a session id. */ ipmi_ret_t openBlob(ManagerInterface* mgr, const uint8_t* reqBuf, uint8_t* replyCmdBuf, size_t* dataLen); /** * Attempts to close the session specified. */ ipmi_ret_t closeBlob(ManagerInterface* mgr, const uint8_t* reqBuf, uint8_t* replyCmdBuf, size_t* dataLen); /** * Attempts to delete the blobId specified. */ ipmi_ret_t deleteBlob(ManagerInterface* mgr, const uint8_t* reqBuf, uint8_t* replyCmdBuf, size_t* dataLen); /** * Attempts to retrieve the Stat for the blobId specified. */ ipmi_ret_t statBlob(ManagerInterface* mgr, const uint8_t* reqBuf, uint8_t* replyCmdBuf, size_t* dataLen); /** * Attempts to retrieve the Stat for the session specified. */ ipmi_ret_t sessionStatBlob(ManagerInterface* mgr, const uint8_t* reqBuf, uint8_t* replyCmdBuf, size_t* dataLen); /** * Attempts to commit the data in the blob. */ ipmi_ret_t commitBlob(ManagerInterface* mgr, const uint8_t* reqBuf, uint8_t* replyCmdBuf, size_t* dataLen); /** * Attempt to read data from the blob. */ ipmi_ret_t readBlob(ManagerInterface* mgr, const uint8_t* reqBuf, uint8_t* replyCmdBuf, size_t* dataLen); /** * Attempt to write data to the blob. */ ipmi_ret_t writeBlob(ManagerInterface* mgr, const uint8_t* reqBuf, uint8_t* replyCmdBuf, size_t* dataLen); /** * Attempt to write metadata to the blob. */ ipmi_ret_t writeMeta(ManagerInterface* mgr, const uint8_t* reqBuf, uint8_t* replyCmdBuf, size_t* dataLen); } // namespace blobs