nvidia-oem: Implement GetRedfishHostName
This command is used by BIOS before creating SMBIOS record
type 42. BIOS gets USBDescription information from BMC.
Note:
The implementation in this PR is for RedfishHostName.
The support for other device descriptors will be added in
upcoming PRs.
Design Document for RHI:
[1] https://gerrit.openbmc.org/c/openbmc/docs/+/79327
Redfish Host Interface specification:
[2] https://www.dmtf.org/sites/default/files/standards/documents/DSP0270_1.3.0.pdf
Tested:
Tested on gb200nvl-obmc platform:
root@gb200nvl-obmc:~# ipmitool raw 0x3c 0x32
67 62 32 30 30 6e 76 6c 2d 6f 62 6d 63
Change-Id: Ib70dd1fb8c4bdf6e6b02c4329069751d1059bad7
Signed-off-by: Prithvi Pai <ppai@nvidia.com>
diff --git a/oem/nvidia/bootstrap-credentials-oem-cmds.cpp b/oem/nvidia/bootstrap-credentials-oem-cmds.cpp
index ba56371..408cf6c 100644
--- a/oem/nvidia/bootstrap-credentials-oem-cmds.cpp
+++ b/oem/nvidia/bootstrap-credentials-oem-cmds.cpp
@@ -8,6 +8,8 @@
#include <ipmid/api.hpp>
#include <ipmid/types.hpp>
+#include <ipmid/utils.hpp>
+#include <phosphor-logging/lg2.hpp>
#include <cstdint>
@@ -45,6 +47,39 @@
return ipmi::responseSuccess(usbSerialNumberPayload);
}
+ipmi::RspType<ipmi::message::Payload> ipmiGetRedfishHostName(
+ ipmi::Context::ptr ctx)
+{
+ std::string service{};
+ constexpr auto networkConfigObj = "/xyz/openbmc_project/network/config";
+ constexpr auto networkConfigIface =
+ "xyz.openbmc_project.Network.SystemConfiguration";
+ boost::system::error_code ec =
+ ipmi::getService(ctx, networkConfigIface, networkConfigObj, service);
+ if (ec)
+ {
+ lg2::error("ipmiGetRedfishHostName failed to get Network SystemConfig "
+ "object: {STATUS}",
+ "STATUS", ec.message());
+ return ipmi::responseResponseError();
+ }
+
+ std::string hostName{};
+ ec = ipmi::getDbusProperty<std::string>(
+ ctx, service, networkConfigObj, networkConfigIface, "HostName",
+ hostName);
+ if (ec)
+ {
+ lg2::error("ipmiGetRedfishHostName failed to get HostName from Network "
+ "SystemConfig service: {STATUS}",
+ "STATUS", ec.message());
+ return ipmi::responseResponseError();
+ }
+ ipmi::message::Payload hostNamePayload;
+ hostNamePayload.pack(
+ std::vector<uint8_t>(hostName.begin(), hostName.end()));
+ return ipmi::responseSuccess(hostNamePayload);
+}
} // namespace ipmi
void registerBootstrapCredentialsOemCommands()
@@ -58,4 +93,9 @@
ipmi::prioOemBase, ipmi::groupNvidia,
ipmi::bootstrap_credentials_oem::cmdGetUsbSerialNumber,
ipmi::Privilege::Admin, ipmi::ipmiGetUsbSerialNumber);
+
+ ipmi::registerHandler(
+ ipmi::prioOemBase, ipmi::groupNvidia,
+ ipmi::bootstrap_credentials_oem::cmdGetRedfishHostName,
+ ipmi::Privilege::Admin, ipmi::ipmiGetRedfishHostName);
}
diff --git a/oem/nvidia/oemcommands.hpp b/oem/nvidia/oemcommands.hpp
index 17ff34f..5cf0a7b 100644
--- a/oem/nvidia/oemcommands.hpp
+++ b/oem/nvidia/oemcommands.hpp
@@ -17,6 +17,7 @@
{
constexpr auto cmdGetUsbVendorIdProductId = 0x30;
constexpr auto cmdGetUsbSerialNumber = 0x31;
+constexpr auto cmdGetRedfishHostName = 0x32;
} // namespace bootstrap_credentials_oem
namespace bios_password