summaryrefslogtreecommitdiffstats
path: root/ipmi.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ipmi.cpp')
-rw-r--r--ipmi.cpp27
1 files changed, 27 insertions, 0 deletions
diff --git a/ipmi.cpp b/ipmi.cpp
index 6942b11..fb5f120 100644
--- a/ipmi.cpp
+++ b/ipmi.cpp
@@ -43,6 +43,8 @@ bool validateRequestLength(BlobOEMCommands command, size_t requestLen)
{BlobOEMCommands::bmcBlobRead, sizeof(struct BmcBlobReadTx)},
{BlobOEMCommands::bmcBlobWrite,
sizeof(struct BmcBlobWriteTx) + sizeof(uint8_t)},
+ {BlobOEMCommands::bmcBlobWriteMeta,
+ sizeof(struct BmcBlobWriteMetaTx) + sizeof(uint8_t)},
};
auto results = minimumLengths.find(command);
@@ -321,4 +323,29 @@ ipmi_ret_t writeBlob(ManagerInterface* mgr, const uint8_t* reqBuf,
return IPMI_CC_OK;
}
+ipmi_ret_t writeMeta(ManagerInterface* mgr, const uint8_t* reqBuf,
+ uint8_t* replyCmdBuf, size_t* dataLen)
+{
+ size_t requestLen = (*dataLen);
+ struct BmcBlobWriteMetaTx request;
+
+ /* Copy over the request. */
+ std::memcpy(&request, reqBuf, sizeof(request));
+
+ /* Determine number of bytes of metadata to write. */
+ uint32_t size = requestLen - sizeof(request);
+
+ /* Nothing really else to validate, we just copy those bytes. */
+ std::vector<uint8_t> data(size);
+ std::memcpy(data.data(), &reqBuf[sizeof(request)], size);
+
+ /* Attempt to write the bytes. */
+ if (!mgr->writeMeta(request.sessionId, request.offset, data))
+ {
+ return IPMI_CC_INVALID;
+ }
+
+ return IPMI_CC_OK;
+}
+
} // namespace blobs
OpenPOWER on IntegriCloud