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