Implement command to retrieve firmware version
Currently, it only supports retrieving BMC/BIOS versions
Change-Id: I58bce16c491f18d27d3989e47814365de091954b
Signed-off-by: John Wang <wangzhiqiang02@ieisystem.com>
diff --git a/src/asset_info.cpp b/src/asset_info.cpp
index 78a7c85..af03fce 100644
--- a/src/asset_info.cpp
+++ b/src/asset_info.cpp
@@ -201,7 +201,7 @@
void registerOEMFunctions(void)
{
- ipmi_register_callback(netFnIei, iei::cmdSetAssetInfo, nullptr,
+ ipmi_register_callback(netFnIEI, iei::cmdSetAssetInfo, nullptr,
ipmiOemIEIAssetInfo, SYSTEM_INTERFACE);
}
diff --git a/src/firmware_version.cpp b/src/firmware_version.cpp
new file mode 100644
index 0000000..fced513
--- /dev/null
+++ b/src/firmware_version.cpp
@@ -0,0 +1,95 @@
+#include "types.hpp"
+#include "utils.hpp"
+
+#include <ipmid/api.hpp>
+
+#include <regex>
+
+namespace ipmi
+{
+namespace iei
+{
+namespace firmware_version
+{
+
+void registerIEIFirmwareVersionFunctions() __attribute__((constructor));
+
+static constexpr auto versionInterface = "xyz.openbmc_project.Software.Version";
+
+std::string getBMCVersionValue(ipmi::Context::ptr ctx,
+ const std::string& objPath,
+ const std::string& interface)
+{
+ std::string value{};
+ auto cc = iei::getDbusProperty(ctx, objPath, interface, "Version", value);
+ if (cc)
+ {
+ return "";
+ }
+
+ const std::regex patternId("v[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}");
+ std::smatch result;
+ if (!std::regex_search(value, result, patternId))
+ {
+ return "";
+ }
+ std::string versionStr = result[0];
+ return versionStr.substr(1);
+}
+
+std::string getFWVersionValue(ipmi::Context::ptr ctx,
+ const std::string& objPath,
+ const std::string& interface)
+{
+ std::string value{};
+ auto cc = iei::getDbusProperty(ctx, objPath, interface, "Version", value);
+ if (cc)
+ {
+ return "";
+ }
+ return value;
+}
+
+enum FirmwareType : uint8_t
+{
+ BMC = 0x01,
+ BIOS = 0x03,
+};
+
+RspType<std::string> ipmiIEIGetFWVersion(ipmi::Context::ptr ctx,
+ uint8_t fwIndex,
+ uint8_t /* devIndex */)
+{
+ std::string fwPath{};
+ std::string value{};
+
+ switch (fwIndex)
+ {
+ case BMC:
+ {
+ fwPath = "/xyz/openbmc_project/software/bmc_active";
+ value = getBMCVersionValue(ctx, fwPath, versionInterface);
+ break;
+ }
+ case BIOS:
+ {
+ fwPath = "/xyz/openbmc_project/software/bios_active";
+ value = getFWVersionValue(ctx, fwPath, versionInterface);
+ break;
+ }
+ default:
+ return ipmi::responseParmOutOfRange();
+ }
+
+ return ipmi::responseSuccess(value);
+}
+
+void registerIEIFirmwareVersionFunctions()
+{
+ ipmi::registerHandler(prioOemBase, netFnIEI, cmdGetFWVersion,
+ ipmi::Privilege::User, ipmiIEIGetFWVersion);
+}
+
+} // namespace firmware_version
+} // namespace iei
+} // namespace ipmi
diff --git a/src/meson.build b/src/meson.build
index 65ecd02..260c160 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -8,6 +8,7 @@
sources = [
'asset_info.cpp',
+ 'firmware_version.cpp',
'utils.cpp',
]
diff --git a/src/types.hpp b/src/types.hpp
index 2054d06..0fc6f72 100644
--- a/src/types.hpp
+++ b/src/types.hpp
@@ -4,14 +4,14 @@
namespace ipmi
{
-constexpr ipmi::NetFn netFnIei = 0x3C;
+constexpr ipmi::NetFn netFnIEI = 0x3C;
constexpr ipmi::NetFn netFnIntelMe = 0x30;
namespace iei
{
constexpr ipmi::Cmd cmdSetAssetInfo = 0x01;
-constexpr ipmi::Cmd cmdGetBMCFWInfo = 0x37;
+constexpr ipmi::Cmd cmdGetFWVersion = 0x03;
} // namespace iei