diff options
author | Patrick Venture <venture@google.com> | 2018-09-12 08:53:29 -0700 |
---|---|---|
committer | Patrick Venture <venture@google.com> | 2018-09-15 13:11:30 -0700 |
commit | ef3aeadc9be37c47d0627e576e81a74a5bb9e94f (patch) | |
tree | 95c183977468b107bdd3faaaa988b5d853be2f00 /main.cpp | |
parent | baa73da1abaaf05ea1133319405fb2b891825618 (diff) | |
download | phosphor-ipmi-blobs-ef3aeadc9be37c47d0627e576e81a74a5bb9e94f.tar.gz phosphor-ipmi-blobs-ef3aeadc9be37c47d0627e576e81a74a5bb9e94f.zip |
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>
Diffstat (limited to 'main.cpp')
-rw-r--r-- | main.cpp | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..e7c1247 --- /dev/null +++ b/main.cpp @@ -0,0 +1,77 @@ +/* + * Copyright 2018 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "config.h" + +#include "ipmi.hpp" +#include "process.hpp" + +#include <host-ipmid/ipmid-api.h> + +#include <cstdio> +#include <host-ipmid/iana.hpp> +#include <host-ipmid/oemrouter.hpp> +#include <memory> + +/* TODO: Swap out once https://gerrit.openbmc-project.xyz/12743 is merged */ +namespace oem +{ +constexpr auto blobTransferCmd = 128; +} // namespace oem + +namespace blobs +{ + +static std::unique_ptr<BlobManager> manager; + +static ipmi_ret_t handleBlobCommand(ipmi_cmd_t cmd, const uint8_t* reqBuf, + uint8_t* replyCmdBuf, size_t* dataLen) +{ + /* It's holding at least a sub-command. The OEN is trimmed from the bytes + * before this is called. + */ + if ((*dataLen) < 1) + { + return IPMI_CC_INVALID; + } + + Crc16 crc; + IpmiBlobHandler command = + validateBlobCommand(&crc, reqBuf, replyCmdBuf, dataLen); + if (command == nullptr) + { + return IPMI_CC_INVALID; + } + + return processBlobCommand(command, manager.get(), &crc, reqBuf, replyCmdBuf, + dataLen); +} + +void setupBlobGlobalHandler() __attribute__((constructor)); + +void setupBlobGlobalHandler() +{ + oem::Router* oemRouter = oem::mutableRouter(); + std::fprintf(stderr, + "Registering OEM:[%#08X], Cmd:[%#04X] for Blob Commands\n", + oem::obmcOemNumber, oem::blobTransferCmd); + + oemRouter->registerHandler(oem::obmcOemNumber, oem::blobTransferCmd, + handleBlobCommand); + + manager = std::make_unique<BlobManager>(); +} +} // namespace blobs |