diff --git a/src/allowlist-filter.cpp b/src/allowlist-filter.cpp
index aed090c..4883b52 100644
--- a/src/allowlist-filter.cpp
+++ b/src/allowlist-filter.cpp
@@ -26,13 +26,12 @@
  */
 class AllowlistFilter
 {
-
   public:
     AllowlistFilter();
     ~AllowlistFilter() = default;
-    AllowlistFilter(AllowlistFilter const&) = delete;
+    AllowlistFilter(const AllowlistFilter&) = delete;
     AllowlistFilter(AllowlistFilter&&) = delete;
-    AllowlistFilter& operator=(AllowlistFilter const&) = delete;
+    AllowlistFilter& operator=(const AllowlistFilter&) = delete;
     AllowlistFilter& operator=(AllowlistFilter&&) = delete;
 
   private:
@@ -111,8 +110,8 @@
 
     ipmi::registerFilter(ipmi::prioOpenBmcBase,
                          [this](ipmi::message::Request::ptr request) {
-                             return filterMessage(request);
-                         });
+        return filterMessage(request);
+    });
 
     channelSMM = getSMMChannel();
     // wait until io->run is going to fetch RestrictionMode
@@ -123,8 +122,8 @@
 {
     try
     {
-        auto service =
-            ipmi::getService(*bus, restrictionModeIntf, restrictionModePath);
+        auto service = ipmi::getService(*bus, restrictionModeIntf,
+                                        restrictionModePath);
         ipmi::Value v =
             ipmi::getDbusProperty(*bus, service, restrictionModePath,
                                   restrictionModeIntf, "RestrictionMode");
@@ -142,11 +141,11 @@
 
     try
     {
-        auto service =
-            ipmi::getService(*bus, systemOsStatusIntf, systemOsStatusPath);
-        ipmi::Value v =
-            ipmi::getDbusProperty(*bus, service, systemOsStatusPath,
-                                  systemOsStatusIntf, "OperatingSystemState");
+        auto service = ipmi::getService(*bus, systemOsStatusIntf,
+                                        systemOsStatusPath);
+        ipmi::Value v = ipmi::getDbusProperty(*bus, service, systemOsStatusPath,
+                                              systemOsStatusIntf,
+                                              "OperatingSystemState");
         auto& value = std::get<std::string>(v);
         updatePostComplete(value);
         log<level::INFO>("Read POST complete value",
@@ -270,15 +269,15 @@
 
     bus->async_method_call(
         [this](boost::system::error_code ec, const ipmi::Value& v) {
-            if (ec)
-            {
-                log<level::ERR>(
-                    "async call failed, coreBIOSDone asserted as default");
-                return;
-            }
-            coreBIOSDone = std::get<bool>(v);
-            log<level::INFO>("Read CoreBiosDone",
-                             entry("VALUE=%d", static_cast<int>(coreBIOSDone)));
+        if (ec)
+        {
+            log<level::ERR>(
+                "async call failed, coreBIOSDone asserted as default");
+            return;
+        }
+        coreBIOSDone = std::get<bool>(v);
+        log<level::INFO>("Read CoreBiosDone",
+                         entry("VALUE=%d", static_cast<int>(coreBIOSDone)));
         },
         coreBiosDoneService, coreBiosDonePath,
         "org.freedesktop.DBus.Properties", "Get", hostMiscIntf, "CoreBiosDone");
@@ -295,8 +294,8 @@
         auto it =
             std::find_if(propertyList.begin(), propertyList.end(),
                          [](const std::pair<std::string, ipmi::Value>& prop) {
-                             return prop.first == "CoreBiosDone";
-                         });
+            return prop.first == "CoreBiosDone";
+            });
 
         if (it != propertyList.end())
         {
@@ -395,11 +394,11 @@
         allowlist.cbegin(), allowlist.cend(),
         std::make_tuple(request->ctx->netFn, request->ctx->cmd, channelMask),
         [](const netfncmd_tuple& first, const netfncmd_tuple& value) {
-            return (std::get<2>(first) & std::get<2>(value))
-                       ? first < std::make_tuple(std::get<0>(value),
-                                                 std::get<1>(value),
-                                                 std::get<2>(first))
-                       : first < value;
+        return (std::get<2>(first) & std::get<2>(value))
+                   ? first < std::make_tuple(std::get<0>(value),
+                                             std::get<1>(value),
+                                             std::get<2>(first))
+                   : first < value;
         });
 
     // no special handling for non-system-interface channels
diff --git a/src/appcommands.cpp b/src/appcommands.cpp
index 722c471..315b581 100644
--- a/src/appcommands.cpp
+++ b/src/appcommands.cpp
@@ -50,8 +50,8 @@
 int initBMCDeviceState(ipmi::Context::ptr ctx)
 {
     DbusObjectInfo objInfo;
-    boost::system::error_code ec =
-        ipmi::getDbusObject(ctx, bmcStateIntf, "/", "bmc0", objInfo);
+    boost::system::error_code ec = ipmi::getDbusObject(ctx, bmcStateIntf, "/",
+                                                       "bmc0", objInfo);
     if (ec)
     {
         phosphor::logging::log<phosphor::logging::level::ERR>(
@@ -84,31 +84,31 @@
         sdbusplus::bus::match::rules::propertiesChanged(objInfo.first,
                                                         bmcStateIntf),
         [](sdbusplus::message_t& msg) {
-            std::map<std::string, ipmi::DbusVariant> props;
-            std::vector<std::string> inVal;
-            std::string iface;
-            try
-            {
-                msg.read(iface, props, inVal);
-            }
-            catch (const std::exception& e)
-            {
-                phosphor::logging::log<phosphor::logging::level::ERR>(
-                    "Exception caught in Get CurrentBMCState");
-                return;
-            }
+        std::map<std::string, ipmi::DbusVariant> props;
+        std::vector<std::string> inVal;
+        std::string iface;
+        try
+        {
+            msg.read(iface, props, inVal);
+        }
+        catch (const std::exception& e)
+        {
+            phosphor::logging::log<phosphor::logging::level::ERR>(
+                "Exception caught in Get CurrentBMCState");
+            return;
+        }
 
-            auto it = props.find(currentBmcStateProp);
-            if (it != props.end())
+        auto it = props.find(currentBmcStateProp);
+        if (it != props.end())
+        {
+            std::string* state = std::get_if<std::string>(&it->second);
+            if (state)
             {
-                std::string* state = std::get_if<std::string>(&it->second);
-                if (state)
-                {
-                    bmcDeviceBusy = (*state != bmcStateReadyStr);
-                    phosphor::logging::log<phosphor::logging::level::INFO>(
-                        "BMC device state updated");
-                }
+                bmcDeviceBusy = (*state != bmcStateReadyStr);
+                phosphor::logging::log<phosphor::logging::level::INFO>(
+                    "BMC device state updated");
             }
+        }
         });
 
     return 0;
@@ -302,8 +302,8 @@
                 devId.fwMajor = static_cast<uint7_t>(revision.major);
 
                 revision.minor = (revision.minor > 99 ? 99 : revision.minor);
-                devId.fwMinor =
-                    revision.minor % 10 + (revision.minor / 10) * 16;
+                devId.fwMinor = revision.minor % 10 +
+                                (revision.minor / 10) * 16;
                 try
                 {
                     uint32_t hash = std::stoul(revision.metaHash, 0, 16);
diff --git a/src/biosconfigcommands.cpp b/src/biosconfigcommands.cpp
index c444112..8f3baa2 100644
--- a/src/biosconfigcommands.cpp
+++ b/src/biosconfigcommands.cpp
@@ -199,8 +199,8 @@
         return false;
     }
 
-    std::string service =
-        getService(*dbus, biosConfigIntf, biosConfigBaseMgrPath);
+    std::string service = getService(*dbus, biosConfigIntf,
+                                     biosConfigBaseMgrPath);
 
     try
     {
@@ -404,19 +404,19 @@
         {
             pSdBusPlus->async_method_call(
                 [](const boost::system::error_code ec) {
-                    /* No more need to keep attributes data in memory */
-                    attributesData.clear();
+                /* No more need to keep attributes data in memory */
+                attributesData.clear();
 
-                    if (ec)
-                    {
-                        phosphor::logging::log<phosphor::logging::level::ERR>(
-                            "sendAllAttributes error: send all attributes - "
-                            "failed");
-                        return;
-                    }
+                if (ec)
+                {
+                    phosphor::logging::log<phosphor::logging::level::ERR>(
+                        "sendAllAttributes error: send all attributes - "
+                        "failed");
+                    return;
+                }
 
-                    phosphor::logging::log<phosphor::logging::level::INFO>(
-                        "sendAllAttributes: send all attributes - done");
+                phosphor::logging::log<phosphor::logging::level::INFO>(
+                    "sendAllAttributes: send all attributes - done");
                 },
                 service, biosConfigBaseMgrPath,
                 "org.freedesktop.DBus.Properties", "Set", biosConfigIntf,
@@ -496,12 +496,11 @@
  */
 static int getResetBIOSSettings(uint8_t& ResetFlag)
 {
-
     try
     {
         std::shared_ptr<sdbusplus::asio::connection> dbus = getSdBus();
-        std::string service =
-            getService(*dbus, biosConfigIntf, biosConfigBaseMgrPath);
+        std::string service = getService(*dbus, biosConfigIntf,
+                                         biosConfigBaseMgrPath);
         Value variant = getDbusProperty(*dbus, service, biosConfigBaseMgrPath,
                                         biosConfigIntf, resetBIOSSettingsProp);
 
@@ -604,7 +603,6 @@
 template <typename... ArgTypes>
 static int generateBIOSXMLFile(const char* path, ArgTypes&&... tArgs)
 {
-
     boost::process::child execProg(path, const_cast<char*>(tArgs)...,
                                    boost::process::std_out > biosXMLFilePath);
     execProg.wait();
@@ -644,7 +642,6 @@
 
     if (ifs.good())
     {
-
         ifs.seekg(std::ios_base::beg);
         ifs.read(reinterpret_cast<char*>(&gNVOOBdata),
                  sizeof(struct NVOOBdata));
@@ -785,8 +782,8 @@
                 return ipmi::response(ipmiCCPayloadChecksumFailed);
             }
             // store the data in temp file
-            std::string FilePath =
-                "/var/oob/temp" + std::to_string(payloadType);
+            std::string FilePath = "/var/oob/temp" +
+                                   std::to_string(payloadType);
 
             std::ofstream outFile(FilePath, std::ios::binary | std::ios::app);
             outFile.seekp(pPayloadInProgress->payloadOffset);
@@ -823,12 +820,12 @@
             {
                 return ipmi::response(ipmiCCPayloadPayloadInComplete);
             }
-            std::string tempFilePath =
-                "/var/oob/temp" + std::to_string(payloadType);
-            std::string payloadFilePath =
-                "/var/oob/Payload" + std::to_string(payloadType);
-            auto renamestatus =
-                std::rename(tempFilePath.c_str(), payloadFilePath.c_str());
+            std::string tempFilePath = "/var/oob/temp" +
+                                       std::to_string(payloadType);
+            std::string payloadFilePath = "/var/oob/Payload" +
+                                          std::to_string(payloadType);
+            auto renamestatus = std::rename(tempFilePath.c_str(),
+                                            payloadFilePath.c_str());
             if (renamestatus)
             {
                 phosphor::logging::log<phosphor::logging::level::ERR>(
@@ -842,7 +839,6 @@
                                                     payloadFilePath.c_str());
                 if (response)
                 {
-
                     phosphor::logging::log<phosphor::logging::level::ERR>(
                         "ipmiOEMSetPayload: generateBIOSXMLFile - failed");
                     gNVOOBdata.payloadInfo[payloadType].payloadStatus =
@@ -907,8 +903,8 @@
             gNVOOBdata.payloadInfo[payloadType].payloadType = 0;
             gNVOOBdata.payloadInfo[payloadType].payloadTotalSize = 0;
             // Delete the temp file
-            std::string tempFilePath =
-                "/var/oob/temp" + std::to_string(payloadType);
+            std::string tempFilePath = "/var/oob/temp" +
+                                       std::to_string(payloadType);
             unlink(tempFilePath.c_str());
             flushNVOOBdata();
             return ipmi::responseSuccess();
@@ -960,8 +956,8 @@
     {
         case ipmi::GetPayloadParameter::GetPayloadInfo:
         {
-            std::string payloadFilePath =
-                "/var/oob/Payload" + std::to_string(payloadType);
+            std::string payloadFilePath = "/var/oob/Payload" +
+                                          std::to_string(payloadType);
 
             std::ifstream ifs(payloadFilePath,
                               std::ios::in | std::ios::binary | std::ios::ate);
@@ -999,8 +995,8 @@
                 }
                 uint32_t offset = reqData.at(0);
                 uint32_t length = reqData.at(1);
-                std::string payloadFilePath =
-                    "/var/oob/Payload" + std::to_string(payloadType);
+                std::string payloadFilePath = "/var/oob/Payload" +
+                                              std::to_string(payloadType);
 
                 if (length > static_cast<uint32_t>(maxGetPayloadDataSize))
                 {
@@ -1165,7 +1161,6 @@
     uint8_t adminPwdChangedFlag = 0;
     if (!data.is_discarded())
     {
-
         adminPwdChangedFlag = data["IsAdminPwdChanged"];
         newAdminHash = data["AdminPwdHash"];
         seed = data["Seed"];
diff --git a/src/bridgingcommands.cpp b/src/bridgingcommands.cpp
index 405db62..0f4cc20 100644
--- a/src/bridgingcommands.cpp
+++ b/src/bridgingcommands.cpp
@@ -136,9 +136,9 @@
     rqLun = ipmbLunFromSeqLunGet(ipmbBuffer->Header.Req.rqSeqLUN);
     cmd = ipmbBuffer->Header.Req.cmd;
 
-    size_t dataLength =
-        bufferLength - (ipmbConnectionHeaderLength +
-                        ipmbRequestDataHeaderLength + ipmbChecksumSize);
+    size_t dataLength = bufferLength -
+                        (ipmbConnectionHeaderLength +
+                         ipmbRequestDataHeaderLength + ipmbChecksumSize);
 
     if (dataLength > 0)
     {
@@ -323,9 +323,9 @@
 
     std::tie(status, netFn, lun, cmd, cc, dataReceived) = ipmbResponse;
 
-    auto respReceived =
-        IpmbResponse(ipmbRequest.rqSA, netFn, lun, ipmbRequest.address,
-                     ipmbRequest.seq, lun, cmd, cc, dataReceived);
+    auto respReceived = IpmbResponse(ipmbRequest.rqSA, netFn, lun,
+                                     ipmbRequest.address, ipmbRequest.seq, lun,
+                                     cmd, cc, dataReceived);
 
     // check IPMB layer status
     if (status)
@@ -688,10 +688,10 @@
     bool,     // Event Direction
     std::array<uint8_t, intel_oem::ipmi::sel::systemEventSize>>; // Event Data
 using oemTsEventType = std::tuple<
-    uint32_t,                                                   // Timestamp
-    std::array<uint8_t, intel_oem::ipmi::sel::oemTsEventSize>>; // Event Data
+    uint32_t,                                                    // Timestamp
+    std::array<uint8_t, intel_oem::ipmi::sel::oemTsEventSize>>;  // Event Data
 using oemEventType =
-    std::array<uint8_t, intel_oem::ipmi::sel::oemEventSize>; // Event Data
+    std::array<uint8_t, intel_oem::ipmi::sel::oemEventSize>;     // Event Data
 
 /** @brief implements of Read event message buffer command
  *
@@ -707,8 +707,8 @@
  *   - eventDir - Event Direction
  *   - eventData - Event Data field
  */
-ipmi::RspType<uint16_t, // Record ID
-              uint8_t,  // Record Type
+ipmi::RspType<uint16_t,                   // Record ID
+              uint8_t,                    // Record Type
               std::variant<systemEventType, oemTsEventType,
                            oemEventType>> // Record Content
     ipmiAppReadEventMessageBuffer(ipmi::Context::ptr ctx)
diff --git a/src/chassiscommands.cpp b/src/chassiscommands.cpp
index 4f748ff..de2a791 100644
--- a/src/chassiscommands.cpp
+++ b/src/chassiscommands.cpp
@@ -97,8 +97,8 @@
     try
     {
         std::string service = LEDService.getService(*bus);
-        ipmi::Value enabled =
-            getDbusProperty(*bus, service, objName, ledInterface, ledProp);
+        ipmi::Value enabled = getDbusProperty(*bus, service, objName,
+                                              ledInterface, ledProp);
         state = std::get<bool>(enabled);
     }
     catch (const sdbusplus::exception_t& e)
@@ -227,8 +227,8 @@
 
     try
     {
-        auto service =
-            ipmi::getService(*busp, powerRestoreIntf, powerRestorePath);
+        auto service = ipmi::getService(*busp, powerRestoreIntf,
+                                        powerRestorePath);
 
         ipmi::Value result =
             ipmi::getDbusProperty(*busp, service, powerRestorePath,
@@ -277,8 +277,8 @@
             "/xyz/openbmc_project/state/chassis0";
         constexpr const char* chassisStateIntf =
             "xyz.openbmc_project.State.Chassis";
-        auto service =
-            ipmi::getService(*busp, chassisStateIntf, chassisStatePath);
+        auto service = ipmi::getService(*busp, chassisStateIntf,
+                                        chassisStatePath);
 
         ipmi::Value variant =
             ipmi::getDbusProperty(*busp, service, chassisStatePath,
@@ -375,8 +375,8 @@
         "xyz.openbmc_project.Control.Host.RestartCause";
 
     std::string service;
-    boost::system::error_code ec =
-        ipmi::getService(ctx, restartCauseIntf, restartCausePath, service);
+    boost::system::error_code ec = ipmi::getService(ctx, restartCauseIntf,
+                                                    restartCausePath, service);
 
     if (!ec)
     {
@@ -420,10 +420,10 @@
               uint2_t, // power restore policy
               bool,    // reserved
 
-              bool, // AC failed
-              bool, // last power down caused by a Power overload
-              bool, // last power down caused by a power interlock
-              bool, // last power down caused by power fault
+              bool,    // AC failed
+              bool,    // last power down caused by a Power overload
+              bool,    // last power down caused by a power interlock
+              bool,    // last power down caused by power fault
               bool, // last ‘Power is on’ state was entered via IPMI command
               uint3_t, // reserved
 
@@ -435,14 +435,14 @@
               bool,    // Chassis Identify command and state info supported
               bool,    // reserved
 
-              bool, // Power off button disabled
-              bool, // Reset button disabled
-              bool, // Diagnostic Interrupt button disabled
-              bool, // Standby (sleep) button disabled
-              bool, // Power off button disable allowed
-              bool, // Reset button disable allowed
-              bool, // Diagnostic Interrupt button disable allowed
-              bool  // Standby (sleep) button disable allowed
+              bool,    // Power off button disabled
+              bool,    // Reset button disabled
+              bool,    // Diagnostic Interrupt button disabled
+              bool,    // Standby (sleep) button disabled
+              bool,    // Power off button disable allowed
+              bool,    // Reset button disable allowed
+              bool,    // Diagnostic Interrupt button disable allowed
+              bool     // Standby (sleep) button disable allowed
               >
     ipmiGetChassisStatus(ipmi::Context::ptr ctx)
 {
diff --git a/src/firmware-update.cpp b/src/firmware-update.cpp
index 05b6576..82364d3 100644
--- a/src/firmware-update.cpp
+++ b/src/firmware-update.cpp
@@ -212,8 +212,7 @@
         check = HashCheck::requested;
     }
 
-    ~TransferHashCheck()
-    {}
+    ~TransferHashCheck() {}
 
     bool hash(const std::vector<uint8_t>& data)
     {
@@ -381,29 +380,29 @@
             sdbusplus::bus::match::rules::propertiesChanged(
                 objPath, "xyz.openbmc_project.Software.ActivationProgress"),
             [&](sdbusplus::message_t& msg) {
-                std::map<std::string, ipmi::DbusVariant> props;
-                std::vector<std::string> inVal;
-                std::string iface;
-                try
-                {
-                    msg.read(iface, props, inVal);
-                }
-                catch (const std::exception& e)
-                {
-                    phosphor::logging::log<phosphor::logging::level::ERR>(
-                        "Exception caught in get ActivationProgress");
-                    return;
-                }
+            std::map<std::string, ipmi::DbusVariant> props;
+            std::vector<std::string> inVal;
+            std::string iface;
+            try
+            {
+                msg.read(iface, props, inVal);
+            }
+            catch (const std::exception& e)
+            {
+                phosphor::logging::log<phosphor::logging::level::ERR>(
+                    "Exception caught in get ActivationProgress");
+                return;
+            }
 
-                auto it = props.find("Progress");
-                if (it != props.end())
+            auto it = props.find("Progress");
+            if (it != props.end())
+            {
+                progressPercent = std::get<uint8_t>(it->second);
+                if (progressPercent == 100)
                 {
-                    progressPercent = std::get<uint8_t>(it->second);
-                    if (progressPercent == 100)
-                    {
-                        fwUpdateState = fwStateUpdateSuccess;
-                    }
+                    fwUpdateState = fwStateUpdateSuccess;
                 }
+            }
             });
     }
     uint8_t activationTimerTimeout()
@@ -466,12 +465,12 @@
         std::shared_ptr<sdbusplus::asio::connection> bus = getSdBus();
         bus->async_method_call(
             [](const boost::system::error_code ec) {
-                if (ec)
-                {
-                    phosphor::logging::log<phosphor::logging::level::ERR>(
-                        "async_method_call error: activateImage failed");
-                    return;
-                }
+            if (ec)
+            {
+                phosphor::logging::log<phosphor::logging::level::ERR>(
+                    "async_method_call error: activateImage failed");
+                return;
+            }
             },
             "xyz.openbmc_project.Software.BMC.Updater", objPath,
             "org.freedesktop.DBus.Properties", "Set",
@@ -510,7 +509,6 @@
 
 static void setFirmwareUpdateMode(const bool mode)
 {
-
     std::string bmcState(bmcStateReady);
     if (mode)
     {
@@ -1064,7 +1062,7 @@
  *   - count - channel count
  *   - channelList - channel list information
  */
-ipmi::RspType<uint8_t, // channel count
+ipmi::RspType<uint8_t,                    // channel count
               std::array<std::tuple<uint8_t, uint32_t>,
                          channelListSize> // Channel List
               >
@@ -1671,8 +1669,8 @@
 static void registerFirmwareFunctions()
 {
     // guarantee that we start with an already timed out timestamp
-    fwRandomNumGenTs =
-        std::chrono::steady_clock::now() - fwRandomNumExpirySeconds;
+    fwRandomNumGenTs = std::chrono::steady_clock::now() -
+                       fwRandomNumExpirySeconds;
     fwUpdateStatus.setState(
         static_cast<uint8_t>(FwUpdateStatusCache::fwStateInit));
 
diff --git a/src/ipmi_to_redfish_hooks.cpp b/src/ipmi_to_redfish_hooks.cpp
index feee538..98ee532 100644
--- a/src/ipmi_to_redfish_hooks.cpp
+++ b/src/ipmi_to_redfish_hooks.cpp
@@ -49,8 +49,8 @@
     // Walk through the SEL request record to build the appropriate Redfish
     // message
     static constexpr std::string_view openBMCMessageRegistryVersion = "0.1";
-    std::string messageID =
-        "OpenBMC." + std::string(openBMCMessageRegistryVersion);
+    std::string messageID = "OpenBMC." +
+                            std::string(openBMCMessageRegistryVersion);
     std::vector<std::string> messageArgs;
     BIOSSensors sensor = static_cast<BIOSSensors>(selData.sensorNum);
     BIOSEventTypes eventType = static_cast<BIOSEventTypes>(selData.eventType);
@@ -296,8 +296,8 @@
     }
     else
     {
-        std::string messageArgsString =
-            boost::algorithm::join(messageArgs, ",");
+        std::string messageArgsString = boost::algorithm::join(messageArgs,
+                                                               ",");
         phosphor::logging::log<phosphor::logging::level::INFO>(
             journalMsg.c_str(),
             phosphor::logging::entry("REDFISH_MESSAGE_ID=%s",
@@ -319,8 +319,8 @@
     // Walk through the SEL request record to build the appropriate Redfish
     // message
     static constexpr std::string_view openBMCMessageRegistryVersion = "0.1";
-    std::string messageID =
-        "OpenBMC." + std::string(openBMCMessageRegistryVersion);
+    std::string messageID = "OpenBMC." +
+                            std::string(openBMCMessageRegistryVersion);
     std::vector<std::string> messageArgs;
     BIOSSMISensors sensor = static_cast<BIOSSMISensors>(selData.sensorNum);
     BIOSEventTypes eventType = static_cast<BIOSEventTypes>(selData.eventType);
diff --git a/src/manufacturingcommands.cpp b/src/manufacturingcommands.cpp
index 644a2e2..3104c3e 100644
--- a/src/manufacturingcommands.cpp
+++ b/src/manufacturingcommands.cpp
@@ -185,7 +185,6 @@
 
 void Manufacturing::revertTimerHandler()
 {
-
 #ifdef BMC_VALIDATION_UNSECURE_FEATURE
     if (mtm.getMfgMode() == SpecialMode::valUnsecure)
     {
@@ -672,9 +671,9 @@
                         pwmName = "Pwm_" + std::to_string(instance + 1);
                     }
                     fanPwmInstancePath = fanPwmPath + pwmName;
-                    ret =
-                        mtm.setProperty(fanService, fanPwmInstancePath, fanIntf,
-                                        "Value", static_cast<double>(pwmValue));
+                    ret = mtm.setProperty(fanService, fanPwmInstancePath,
+                                          fanIntf, "Value",
+                                          static_cast<double>(pwmValue));
                     if (ret < 0)
                     {
                         return ipmi::responseUnspecifiedError();
@@ -704,8 +703,8 @@
                         return ipmi::response(retCode);
                     }
 
-                    if ((mtm.mtmTestBeepFd =
-                             ::open(beepDevName, O_RDWR | O_CLOEXEC)) < 0)
+                    if ((mtm.mtmTestBeepFd = ::open(beepDevName,
+                                                    O_RDWR | O_CLOEXEC)) < 0)
                     {
                         lg2::error("Failed to open input device");
                         return ipmi::responseUnspecifiedError();
@@ -766,8 +765,8 @@
                 lg2::error("Failed to query HSBP drive sub tree objects");
                 return ipmi::responseUnspecifiedError();
             }
-            std::string driveObjPath =
-                driveBasePath + "Drive_" + std::to_string(instance + 1);
+            std::string driveObjPath = driveBasePath + "Drive_" +
+                                       std::to_string(instance + 1);
             if (std::find(driveList.begin(), driveList.end(), driveObjPath) ==
                 driveList.end())
             {
@@ -981,8 +980,8 @@
         writeData.push_back(static_cast<uint8_t>(macOffset));
         std::vector<uint8_t> readBuf(macRecordSize);
         std::string i2cBus = "/dev/i2c-" + std::to_string(fruBus);
-        ipmi::Cc retI2C =
-            ipmi::i2cWriteRead(i2cBus, fruAddress, writeData, readBuf);
+        ipmi::Cc retI2C = ipmi::i2cWriteRead(i2cBus, fruAddress, writeData,
+                                             readBuf);
         if (retI2C == ipmi::ccSuccess)
         {
             uint8_t cs = calculateChecksum(readBuf.cbegin(), readBuf.cend());
@@ -1025,14 +1024,14 @@
         writeData.push_back(macHeader);
         std::for_each(ethData.cbegin(), ethData.cend(),
                       [&](uint8_t i) { writeData.push_back(i); });
-        uint8_t macCheckSum =
-            calculateChecksum(++writeData.cbegin(), writeData.cend());
+        uint8_t macCheckSum = calculateChecksum(++writeData.cbegin(),
+                                                writeData.cend());
         writeData.push_back(macCheckSum);
 
         std::string i2cBus = "/dev/i2c-" + std::to_string(fruBus);
         std::vector<uint8_t> readBuf;
-        ipmi::Cc ret =
-            ipmi::i2cWriteRead(i2cBus, fruAddress, writeData, readBuf);
+        ipmi::Cc ret = ipmi::i2cWriteRead(i2cBus, fruAddress, writeData,
+                                          readBuf);
 
         // prepare for read to detect chip is write protected
         writeData.resize(1);
@@ -1266,8 +1265,8 @@
 
     std::vector<uint8_t> readBuf(readCount);
 
-    ipmi::Cc retI2C =
-        ipmi::i2cWriteRead(i2cBus, targetAddr, writeData, readBuf);
+    ipmi::Cc retI2C = ipmi::i2cWriteRead(i2cBus, targetAddr, writeData,
+                                         readBuf);
     if (retI2C != ipmi::ccSuccess)
     {
         return ipmi::response(retI2C);
@@ -1286,8 +1285,8 @@
     std::vector<uint8_t> writeData = {0x61, 0x1};
     std::vector<uint8_t> readBuf(0);
 
-    ipmi::Cc retI2C =
-        ipmi::i2cWriteRead(i2cBus, targetAddr, writeData, readBuf);
+    ipmi::Cc retI2C = ipmi::i2cWriteRead(i2cBus, targetAddr, writeData,
+                                         readBuf);
     return ipmi::response(retI2C);
 }
 
@@ -1407,8 +1406,8 @@
         boost::algorithm::replace_first_copy(
             objectPath, "/xyz/openbmc_project/inventory/system/board/", ""),
         "/", "_2f");
-    std::string unitName =
-        "xyz.openbmc_project.mctpd@" + serviceArgument + ".service";
+    std::string unitName = "xyz.openbmc_project.mctpd@" + serviceArgument +
+                           ".service";
     return unitName;
 }
 
@@ -1429,7 +1428,7 @@
 
     for (const auto& objectPath : configPaths)
     {
-        auto const pos = objectPath.find_last_of('/');
+        const auto pos = objectPath.find_last_of('/');
         if (binding == objectPath.substr(pos + 1))
         {
             return startOrStopService(ctx, enable,
@@ -1534,6 +1533,6 @@
 
     ipmi::registerFilter(ipmi::prioOemBase,
                          [](ipmi::message::Request::ptr request) {
-                             return ipmi::mfgFilterMessage(request);
-                         });
+        return ipmi::mfgFilterMessage(request);
+    });
 }
diff --git a/src/me_to_redfish_hooks.cpp b/src/me_to_redfish_hooks.cpp
index a891d68..8c51db2 100644
--- a/src/me_to_redfish_hooks.cpp
+++ b/src/me_to_redfish_hooks.cpp
@@ -361,4 +361,4 @@
 
     return defaultMessageHook(ipmiRaw);
 }
-} // namespace intel_oem::ipmi::sel::redfish_hooks::me
\ No newline at end of file
+} // namespace intel_oem::ipmi::sel::redfish_hooks::me
diff --git a/src/multinodecommands.cpp b/src/multinodecommands.cpp
index d6712b3..a0e7183 100644
--- a/src/multinodecommands.cpp
+++ b/src/multinodecommands.cpp
@@ -33,8 +33,8 @@
     auto pdbus = getSdBus();
     try
     {
-        std::string service =
-            getService(*pdbus, multiNodeIntf, multiNodeObjPath);
+        std::string service = getService(*pdbus, multiNodeIntf,
+                                         multiNodeObjPath);
         Value dbusValue = getDbusProperty(*pdbus, service, multiNodeObjPath,
                                           multiNodeIntf, name);
         return std::get<uint8_t>(dbusValue);
@@ -53,8 +53,8 @@
     auto pdbus = getSdBus();
     try
     {
-        std::string service =
-            getService(*pdbus, multiNodeIntf, multiNodeObjPath);
+        std::string service = getService(*pdbus, multiNodeIntf,
+                                         multiNodeObjPath);
         Value dbusValue = getDbusProperty(*pdbus, service, multiNodeObjPath,
                                           multiNodeIntf, "NodeRole");
         std::string valueStr = std::get<std::string>(dbusValue);
diff --git a/src/oemcommands.cpp b/src/oemcommands.cpp
index 11dab6f..390e112 100644
--- a/src/oemcommands.cpp
+++ b/src/oemcommands.cpp
@@ -206,7 +206,6 @@
 
     if (ec)
     {
-
         phosphor::logging::log<phosphor::logging::level::ERR>(
             "Failed to fetch PFR object from dbus",
             phosphor::logging::entry("INTERFACE=%s", sessionIntf),
@@ -238,7 +237,6 @@
 
         for (const auto& [propName, propVariant] : result)
         {
-
             if (propName == "Address")
             {
                 address = std::get_if<uint64_t>(&propVariant);
@@ -270,8 +268,8 @@
     // trigger the write FIFO operation.
     std::vector<uint8_t> writeData = {cmdReg, val};
     std::vector<uint8_t> readBuf(0);
-    ipmi::Cc retI2C =
-        ipmi::i2cWriteRead(i2cBus, targetAddr, writeData, readBuf);
+    ipmi::Cc retI2C = ipmi::i2cWriteRead(i2cBus, targetAddr, writeData,
+                                         readBuf);
 }
 
 } // namespace mailbox
@@ -349,8 +347,8 @@
 
     try
     {
-        auto service =
-            ipmi::getService(*busp, bmcResetDisablesIntf, bmcResetDisablesPath);
+        auto service = ipmi::getService(*busp, bmcResetDisablesIntf,
+                                        bmcResetDisablesPath);
         ipmi::setDbusProperty(*busp, service, bmcResetDisablesPath,
                               bmcResetDisablesIntf, "ResetOnSMI",
                               !disableResetOnSMI);
@@ -376,8 +374,8 @@
     std::shared_ptr<sdbusplus::asio::connection> busp = getSdBus();
     try
     {
-        auto service =
-            ipmi::getService(*busp, bmcResetDisablesIntf, bmcResetDisablesPath);
+        auto service = ipmi::getService(*busp, bmcResetDisablesIntf,
+                                        bmcResetDisablesPath);
         Value variant =
             ipmi::getDbusProperty(*busp, service, bmcResetDisablesPath,
                                   bmcResetDisablesIntf, "ResetOnSMI");
@@ -432,8 +430,8 @@
     std::shared_ptr<sdbusplus::asio::connection> dbus = getSdBus();
     try
     {
-        std::string hsbpObjPath =
-            "/xyz/openbmc_project/software/HSBP_" + std::to_string(hscNumber);
+        std::string hsbpObjPath = "/xyz/openbmc_project/software/HSBP_" +
+                                  std::to_string(hscNumber);
         auto service = getService(*dbus, biosVersionIntf, hsbpObjPath);
         Value hscVersionValue =
             getDbusProperty(*dbus, "xyz.openbmc_project.HsbpManager",
@@ -557,8 +555,8 @@
             }
 
             std::shared_ptr<sdbusplus::asio::connection> dbus = getSdBus();
-            std::string service =
-                getService(*dbus, biosVersionIntf, biosActiveObjPath);
+            std::string service = getService(*dbus, biosVersionIntf,
+                                             biosActiveObjPath);
             try
             {
                 Value variant =
@@ -682,11 +680,11 @@
     }
 
     std::shared_ptr<sdbusplus::asio::connection> dbus = getSdBus();
-    std::string service =
-        getService(*dbus, powerRestoreDelayIntf, powerRestoreDelayObjPath);
-    Value variant =
-        getDbusProperty(*dbus, service, powerRestoreDelayObjPath,
-                        powerRestoreDelayIntf, powerRestoreDelayProp);
+    std::string service = getService(*dbus, powerRestoreDelayIntf,
+                                     powerRestoreDelayObjPath);
+    Value variant = getDbusProperty(*dbus, service, powerRestoreDelayObjPath,
+                                    powerRestoreDelayIntf,
+                                    powerRestoreDelayProp);
 
     uint64_t val = std::get<uint64_t>(variant);
     val /= 1000000UL;
@@ -795,8 +793,8 @@
             break;
     }
 
-    std::string firmwareInstanceStr =
-        firmware + " instance: " + std::to_string(instance);
+    std::string firmwareInstanceStr = firmware +
+                                      " instance: " + std::to_string(instance);
     std::string message("[firmware update] " + firmwareInstanceStr +
                         " status: <" + action + "> " + buildInfo);
 
@@ -869,8 +867,8 @@
     delay = (delay << 8) | data->byteLSB;
     uint64_t val = delay * 1000000;
     std::shared_ptr<sdbusplus::asio::connection> dbus = getSdBus();
-    std::string service =
-        getService(*dbus, powerRestoreDelayIntf, powerRestoreDelayObjPath);
+    std::string service = getService(*dbus, powerRestoreDelayIntf,
+                                     powerRestoreDelayObjPath);
     setDbusProperty(*dbus, service, powerRestoreDelayObjPath,
                     powerRestoreDelayIntf, powerRestoreDelayProp, val);
     *dataLen = 0;
@@ -888,8 +886,8 @@
     std::shared_ptr<sdbusplus::asio::connection> busp = getSdBus();
     try
     {
-        auto service =
-            ipmi::getService(*busp, cpuPresenceIntf, cpuPresencePath);
+        auto service = ipmi::getService(*busp, cpuPresenceIntf,
+                                        cpuPresencePath);
 
         ipmi::Value result = ipmi::getDbusProperty(
             *busp, service, cpuPresencePath, cpuPresenceIntf, "Present");
@@ -1051,8 +1049,8 @@
     try
     {
         std::shared_ptr<sdbusplus::asio::connection> dbus = getSdBus();
-        std::string service =
-            getService(*dbus, oemShutdownPolicyIntf, oemShutdownPolicyObjPath);
+        std::string service = getService(*dbus, oemShutdownPolicyIntf,
+                                         oemShutdownPolicyObjPath);
         Value variant = getDbusProperty(
             *dbus, service, oemShutdownPolicyObjPath, oemShutdownPolicyIntf,
             oemShutdownPolicyObjPathProp);
@@ -1136,8 +1134,8 @@
     try
     {
         std::shared_ptr<sdbusplus::asio::connection> dbus = getSdBus();
-        std::string service =
-            getService(*dbus, oemShutdownPolicyIntf, oemShutdownPolicyObjPath);
+        std::string service = getService(*dbus, oemShutdownPolicyIntf,
+                                         oemShutdownPolicyObjPath);
         setDbusProperty(
             *dbus, service, oemShutdownPolicyObjPath, oemShutdownPolicyIntf,
             oemShutdownPolicyObjPathProp,
@@ -1167,8 +1165,8 @@
         }
         auto ethIP = ethdevice + "/ipv4";
         std::shared_ptr<sdbusplus::asio::connection> dbus = getSdBus();
-        auto ethernetObj =
-            getDbusObject(*dbus, networkIPIntf, networkRoot, ethIP);
+        auto ethernetObj = getDbusObject(*dbus, networkIPIntf, networkRoot,
+                                         ethIP);
         auto value = getDbusProperty(*dbus, networkService, ethernetObj.first,
                                      networkIPIntf, "Origin");
         if (std::get<std::string>(value) ==
@@ -1194,7 +1192,6 @@
  */
 static bool isDHCPIPv6Enabled(uint8_t Channel)
 {
-
     try
     {
         auto ethdevice = getChannelName(Channel);
@@ -1204,8 +1201,8 @@
         }
         auto ethIP = ethdevice + "/ipv6";
         std::shared_ptr<sdbusplus::asio::connection> dbus = getSdBus();
-        auto objectInfo =
-            getDbusObject(*dbus, networkIPIntf, networkRoot, ethIP);
+        auto objectInfo = getDbusObject(*dbus, networkIPIntf, networkRoot,
+                                        ethIP);
         auto properties = getAllDbusProperties(*dbus, objectInfo.second,
                                                objectInfo.first, networkIPIntf);
         if (std::get<std::string>(properties["Origin"]) ==
@@ -1263,7 +1260,6 @@
         }
         else
         {
-
             if (chInfo.mediumType ==
                 static_cast<uint8_t>(EChannelMediumType::lan8032))
             {
@@ -1456,7 +1452,6 @@
         }
         else
         {
-
             status = executeCmd("passwd -d asdbg");
 
             if (status == 0)
@@ -1488,8 +1483,8 @@
     try
     {
         std::string service = getService(bus, intf, objPath);
-        Value stateValue =
-            getDbusProperty(bus, service, objPath, intf, "State");
+        Value stateValue = getDbusProperty(bus, service, objPath, intf,
+                                           "State");
         std::string strState = std::get<std::string>(stateValue);
         state = ledAction::actionDbusToIpmi.at(
             sdbusplus::xyz::openbmc_project::Led::server::Physical::
@@ -1733,7 +1728,6 @@
     {
         if (performanceMode)
         {
-
             if (std::find(supported->begin(), supported->end(),
                           "Performance") != supported->end())
             {
@@ -1834,10 +1828,10 @@
 static std::string getConfigPath(const std::string& name)
 {
     std::shared_ptr<sdbusplus::asio::connection> dbus = getSdBus();
-    auto method =
-        dbus->new_method_call("xyz.openbmc_project.ObjectMapper",
-                              "/xyz/openbmc_project/object_mapper",
-                              "xyz.openbmc_project.ObjectMapper", "GetSubTree");
+    auto method = dbus->new_method_call("xyz.openbmc_project.ObjectMapper",
+                                        "/xyz/openbmc_project/object_mapper",
+                                        "xyz.openbmc_project.ObjectMapper",
+                                        "GetSubTree");
 
     method.append("/", 0, std::array<const char*, 1>{pidConfigurationIface});
     std::string path;
@@ -1852,10 +1846,10 @@
         phosphor::logging::log<phosphor::logging::level::ERR>(
             "ipmiOEMGetFscParameter: mapper error");
     };
-    auto config =
-        std::find_if(resp.begin(), resp.end(), [&name](const auto& pair) {
-            return pair.first.find(name) != std::string::npos;
-        });
+    auto config = std::find_if(resp.begin(), resp.end(),
+                               [&name](const auto& pair) {
+        return pair.first.find(name) != std::string::npos;
+    });
     if (config != resp.end())
     {
         path = std::move(config->first);
@@ -1868,10 +1862,10 @@
 {
     boost::container::flat_map<std::string, PropertyMap> ret;
     std::shared_ptr<sdbusplus::asio::connection> dbus = getSdBus();
-    auto method =
-        dbus->new_method_call("xyz.openbmc_project.ObjectMapper",
-                              "/xyz/openbmc_project/object_mapper",
-                              "xyz.openbmc_project.ObjectMapper", "GetSubTree");
+    auto method = dbus->new_method_call("xyz.openbmc_project.ObjectMapper",
+                                        "/xyz/openbmc_project/object_mapper",
+                                        "xyz.openbmc_project.ObjectMapper",
+                                        "GetSubTree");
 
     method.append("/", 0, std::array<const char*, 1>{pidConfigurationIface});
     GetSubTreeType resp;
@@ -1966,7 +1960,6 @@
     boost::container::flat_map<std::string, PropertyMap> data = getPidConfigs();
     if (data.empty())
     {
-
         phosphor::logging::log<phosphor::logging::level::ERR>(
             "ipmiOEMSetFanSpeedOffset: found no pid configurations!");
         return ipmi::responseResponseError();
@@ -1979,7 +1972,6 @@
         auto findClass = pid.find("Class");
         if (findClass == pid.end())
         {
-
             phosphor::logging::log<phosphor::logging::level::ERR>(
                 "ipmiOEMSetFanSpeedOffset: found illegal pid "
                 "configurations");
@@ -1991,7 +1983,6 @@
             auto findOutLimit = pid.find("OutLimitMin");
             if (findOutLimit == pid.end())
             {
-
                 phosphor::logging::log<phosphor::logging::level::ERR>(
                     "ipmiOEMSetFanSpeedOffset: found illegal pid "
                     "configurations");
@@ -2072,7 +2063,6 @@
         boost::container::flat_map data = getPidConfigs();
         if (data.empty())
         {
-
             phosphor::logging::log<phosphor::logging::level::ERR>(
                 "ipmiOEMSetFscParameter: found no pid configurations!");
             return ipmi::responseResponseError();
@@ -2083,7 +2073,6 @@
             auto findClass = pid.find("Class");
             if (findClass == pid.end())
             {
-
                 phosphor::logging::log<phosphor::logging::level::ERR>(
                     "ipmiOEMSetFscParameter: found illegal pid "
                     "configurations");
@@ -2221,7 +2210,6 @@
     }
     else if (command == static_cast<uint8_t>(setFscParamFlags::cfm))
     {
-
         /*
         DataLen should be 1, but host is sending us an extra bit. As the
         previous behavior didn't seem to prevent this, ignore the check for
@@ -3148,11 +3136,11 @@
     try
     {
         std::shared_ptr<sdbusplus::asio::connection> dbus = getSdBus();
-        std::string service =
-            getService(*dbus, oemNmiSourceIntf, oemNmiSourceObjPath);
-        Value variant =
-            getDbusProperty(*dbus, service, oemNmiSourceObjPath,
-                            oemNmiSourceIntf, oemNmiBmcSourceObjPathProp);
+        std::string service = getService(*dbus, oemNmiSourceIntf,
+                                         oemNmiSourceObjPath);
+        Value variant = getDbusProperty(*dbus, service, oemNmiSourceObjPath,
+                                        oemNmiSourceIntf,
+                                        oemNmiBmcSourceObjPathProp);
 
         switch (nmi::NMISource::convertBMCSourceSignalFromString(
             std::get<std::string>(variant)))
@@ -3241,8 +3229,8 @@
     {
         // keep NMI signal source
         std::shared_ptr<sdbusplus::asio::connection> dbus = getSdBus();
-        std::string service =
-            getService(*dbus, oemNmiSourceIntf, oemNmiSourceObjPath);
+        std::string service = getService(*dbus, oemNmiSourceIntf,
+                                         oemNmiSourceObjPath);
         setDbusProperty(*dbus, service, oemNmiSourceObjPath, oemNmiSourceIntf,
                         oemNmiBmcSourceObjPathProp,
                         nmi::convertForMessage(bmcSourceSignal));
@@ -3364,7 +3352,6 @@
 
 ipmi::RspType<uint8_t> ipmiOEMGetDimmOffset(uint8_t type, uint8_t index)
 {
-
     if (type != static_cast<uint8_t>(dimmOffsetTypes::dimmPower) &&
         type != static_cast<uint8_t>(dimmOffsetTypes::staticCltt))
     {
@@ -3819,8 +3806,8 @@
     // This command should run only from multi-node product.
     // For all other platforms this command will return invalid.
 
-    std::optional<uint8_t> nodeInfo =
-        getMultiNodeInfoPresence(ctx, "NodePresence");
+    std::optional<uint8_t> nodeInfo = getMultiNodeInfoPresence(ctx,
+                                                               "NodePresence");
     if (!nodeInfo || !*nodeInfo)
     {
         return ipmi::responseInvalidCommand();
@@ -3878,7 +3865,6 @@
 {
     if (!ipmi::mailbox::i2cConfigLoaded)
     {
-
         phosphor::logging::log<phosphor::logging::level::ERR>(
             "Calling PFR Load Configuration Function to Get I2C Bus and Target "
             "Address ");
@@ -3922,7 +3908,6 @@
 
                 for (int i = 0; i < numOfBytes; i++)
                 {
-
                     ipmi::Cc ret = ipmi::i2cWriteRead(ipmi::mailbox::i2cBus,
                                                       ipmi::mailbox::targetAddr,
                                                       writeData, readBuf);
@@ -3964,7 +3949,6 @@
 
         default:
         {
-
             phosphor::logging::log<phosphor::logging::level::ERR>(
                 "OEM IPMI command: Register identifier is not valid.It should "
                 "be 0 "
diff --git a/src/sensorcommands.cpp b/src/sensorcommands.cpp
index fcc2593..41a6297 100644
--- a/src/sensorcommands.cpp
+++ b/src/sensorcommands.cpp
@@ -92,10 +92,10 @@
     "type='signal',member='InterfacesAdded',arg0path='/xyz/openbmc_project/"
     "sensors/'",
     [](sdbusplus::message_t& m) {
-        sensorTree.clear();
-        sdrLastAdd = std::chrono::duration_cast<std::chrono::seconds>(
-                         std::chrono::system_clock::now().time_since_epoch())
-                         .count();
+    sensorTree.clear();
+    sdrLastAdd = std::chrono::duration_cast<std::chrono::seconds>(
+                     std::chrono::system_clock::now().time_since_epoch())
+                     .count();
     });
 
 static sdbusplus::bus::match_t sensorRemoved(
@@ -103,10 +103,10 @@
     "type='signal',member='InterfacesRemoved',arg0path='/xyz/openbmc_project/"
     "sensors/'",
     [](sdbusplus::message_t& m) {
-        sensorTree.clear();
-        sdrLastRemove = std::chrono::duration_cast<std::chrono::seconds>(
-                            std::chrono::system_clock::now().time_since_epoch())
-                            .count();
+    sensorTree.clear();
+    sdrLastRemove = std::chrono::duration_cast<std::chrono::seconds>(
+                        std::chrono::system_clock::now().time_since_epoch())
+                        .count();
     });
 
 // this keeps track of deassertions for sensor event status command. A
@@ -120,42 +120,41 @@
     "type='signal',member='PropertiesChanged',interface='org.freedesktop.DBus."
     "Properties',arg0namespace='xyz.openbmc_project.Sensor.Threshold'",
     [](sdbusplus::message_t& m) {
-        boost::container::flat_map<std::string, ipmi::DbusVariant> values;
-        m.read(std::string(), values);
+    boost::container::flat_map<std::string, ipmi::DbusVariant> values;
+    m.read(std::string(), values);
 
-        auto findAssert =
-            std::find_if(values.begin(), values.end(), [](const auto& pair) {
-                return pair.first.find("Alarm") != std::string::npos;
-            });
-        if (findAssert != values.end())
+    auto findAssert = std::find_if(values.begin(), values.end(),
+                                   [](const auto& pair) {
+        return pair.first.find("Alarm") != std::string::npos;
+    });
+    if (findAssert != values.end())
+    {
+        auto ptr = std::get_if<bool>(&(findAssert->second));
+        if (ptr == nullptr)
         {
-            auto ptr = std::get_if<bool>(&(findAssert->second));
-            if (ptr == nullptr)
-            {
-                phosphor::logging::log<phosphor::logging::level::ERR>(
-                    "thresholdChanged: Assert non bool");
-                return;
-            }
-            if (*ptr)
+            phosphor::logging::log<phosphor::logging::level::ERR>(
+                "thresholdChanged: Assert non bool");
+            return;
+        }
+        if (*ptr)
+        {
+            phosphor::logging::log<phosphor::logging::level::INFO>(
+                "thresholdChanged: Assert",
+                phosphor::logging::entry("SENSOR=%s", m.get_path()));
+            thresholdDeassertMap[m.get_path()][findAssert->first] = *ptr;
+        }
+        else
+        {
+            auto& value = thresholdDeassertMap[m.get_path()][findAssert->first];
+            if (value)
             {
                 phosphor::logging::log<phosphor::logging::level::INFO>(
-                    "thresholdChanged: Assert",
+                    "thresholdChanged: deassert",
                     phosphor::logging::entry("SENSOR=%s", m.get_path()));
-                thresholdDeassertMap[m.get_path()][findAssert->first] = *ptr;
-            }
-            else
-            {
-                auto& value =
-                    thresholdDeassertMap[m.get_path()][findAssert->first];
-                if (value)
-                {
-                    phosphor::logging::log<phosphor::logging::level::INFO>(
-                        "thresholdChanged: deassert",
-                        phosphor::logging::entry("SENSOR=%s", m.get_path()));
-                    value = *ptr;
-                }
+                value = *ptr;
             }
         }
+    }
     });
 
 static void getSensorMaxMin(const SensorMap& sensorMap, double& max,
@@ -201,7 +200,6 @@
     }
     if (warning != sensorMap.end())
     {
-
         auto lower = warning->second.find("WarningLow");
         auto upper = warning->second.find("WarningHigh");
         if (lower != warning->second.end())
@@ -324,9 +322,9 @@
     }
 
     std::shared_ptr<sdbusplus::asio::connection> dbus = getSdBus();
-    auto setHealth =
-        dbus->new_method_call(meHealth::busname, meHealth::path,
-                              meHealth::interface, meHealth::method);
+    auto setHealth = dbus->new_method_call(meHealth::busname, meHealth::path,
+                                           meHealth::interface,
+                                           meHealth::method);
     setHealth.append(std::to_string(static_cast<size_t>(eventData2)), state);
     try
     {
@@ -368,7 +366,6 @@
     if (static_cast<ipmi::EChannelMediumType>(chInfo.mediumType) ==
         ipmi::EChannelMediumType::systemInterface)
     {
-
         p.unpack(sysgeneratorID, evmRev, sensorType, sensorNum, eventType,
                  eventData1, eventData2, eventData3);
         constexpr const uint8_t isSoftwareID = 0x01;
@@ -384,7 +381,6 @@
     }
     else
     {
-
         p.unpack(evmRev, sensorType, sensorNum, eventType, eventData1,
                  eventData2, eventData3);
         // Refer to IPMI Spec Table 32: SEL Event Records
@@ -471,8 +467,8 @@
         return ipmi::responseResponseError();
     }
 
-    uint8_t value =
-        scaleIPMIValueFromDouble(reading, mValue, rExp, bValue, bExp, bSigned);
+    uint8_t value = scaleIPMIValueFromDouble(reading, mValue, rExp, bValue,
+                                             bExp, bSigned);
     uint8_t operation =
         static_cast<uint8_t>(IPMISensorReadingByte2::sensorScanningEnable);
     operation |=
@@ -786,9 +782,8 @@
 
             if (warningHigh != warningMap.end())
             {
-
-                double value =
-                    std::visit(VariantToDoubleVisitor(), warningHigh->second);
+                double value = std::visit(VariantToDoubleVisitor(),
+                                          warningHigh->second);
                 if (std::isfinite(value))
                 {
                     resp.warningHigh = scaleIPMIValueFromDouble(
@@ -797,8 +792,8 @@
             }
             if (warningLow != warningMap.end())
             {
-                double value =
-                    std::visit(VariantToDoubleVisitor(), warningLow->second);
+                double value = std::visit(VariantToDoubleVisitor(),
+                                          warningLow->second);
                 if (std::isfinite(value))
                 {
                     resp.warningLow = scaleIPMIValueFromDouble(
@@ -815,8 +810,8 @@
 
             if (criticalHigh != criticalMap.end())
             {
-                double value =
-                    std::visit(VariantToDoubleVisitor(), criticalHigh->second);
+                double value = std::visit(VariantToDoubleVisitor(),
+                                          criticalHigh->second);
                 if (std::isfinite(value))
                 {
                     resp.criticalHigh = scaleIPMIValueFromDouble(
@@ -825,8 +820,8 @@
             }
             if (criticalLow != criticalMap.end())
             {
-                double value =
-                    std::visit(VariantToDoubleVisitor(), criticalLow->second);
+                double value = std::visit(VariantToDoubleVisitor(),
+                                          criticalLow->second);
                 if (std::isfinite(value))
                 {
                     resp.criticalLow = scaleIPMIValueFromDouble(
@@ -977,30 +972,30 @@
             auto warningLow = warningMap.find("WarningLow");
             if (warningHigh != warningMap.end())
             {
-                double value =
-                    std::visit(VariantToDoubleVisitor(), warningHigh->second);
+                double value = std::visit(VariantToDoubleVisitor(),
+                                          warningHigh->second);
                 if (std::isfinite(value))
                 {
-                    assertionEnabledLsb |=
-                        static_cast<uint8_t>(IPMISensorEventEnableThresholds::
-                                                 upperNonCriticalGoingHigh);
-                    deassertionEnabledLsb |=
-                        static_cast<uint8_t>(IPMISensorEventEnableThresholds::
-                                                 upperNonCriticalGoingLow);
+                    assertionEnabledLsb |= static_cast<uint8_t>(
+                        IPMISensorEventEnableThresholds::
+                            upperNonCriticalGoingHigh);
+                    deassertionEnabledLsb |= static_cast<uint8_t>(
+                        IPMISensorEventEnableThresholds::
+                            upperNonCriticalGoingLow);
                 }
             }
             if (warningLow != warningMap.end())
             {
-                double value =
-                    std::visit(VariantToDoubleVisitor(), warningLow->second);
+                double value = std::visit(VariantToDoubleVisitor(),
+                                          warningLow->second);
                 if (std::isfinite(value))
                 {
-                    assertionEnabledLsb |=
-                        static_cast<uint8_t>(IPMISensorEventEnableThresholds::
-                                                 lowerNonCriticalGoingLow);
-                    deassertionEnabledLsb |=
-                        static_cast<uint8_t>(IPMISensorEventEnableThresholds::
-                                                 lowerNonCriticalGoingHigh);
+                    assertionEnabledLsb |= static_cast<uint8_t>(
+                        IPMISensorEventEnableThresholds::
+                            lowerNonCriticalGoingLow);
+                    deassertionEnabledLsb |= static_cast<uint8_t>(
+                        IPMISensorEventEnableThresholds::
+                            lowerNonCriticalGoingHigh);
                 }
             }
         }
@@ -1013,28 +1008,28 @@
 
             if (criticalHigh != criticalMap.end())
             {
-                double value =
-                    std::visit(VariantToDoubleVisitor(), criticalHigh->second);
+                double value = std::visit(VariantToDoubleVisitor(),
+                                          criticalHigh->second);
                 if (std::isfinite(value))
                 {
-                    assertionEnabledMsb |=
-                        static_cast<uint8_t>(IPMISensorEventEnableThresholds::
-                                                 upperCriticalGoingHigh);
+                    assertionEnabledMsb |= static_cast<uint8_t>(
+                        IPMISensorEventEnableThresholds::
+                            upperCriticalGoingHigh);
                     deassertionEnabledMsb |= static_cast<uint8_t>(
                         IPMISensorEventEnableThresholds::upperCriticalGoingLow);
                 }
             }
             if (criticalLow != criticalMap.end())
             {
-                double value =
-                    std::visit(VariantToDoubleVisitor(), criticalLow->second);
+                double value = std::visit(VariantToDoubleVisitor(),
+                                          criticalLow->second);
                 if (std::isfinite(value))
                 {
                     assertionEnabledLsb |= static_cast<uint8_t>(
                         IPMISensorEventEnableThresholds::lowerCriticalGoingLow);
-                    deassertionEnabledLsb |=
-                        static_cast<uint8_t>(IPMISensorEventEnableThresholds::
-                                                 lowerCriticalGoingHigh);
+                    deassertionEnabledLsb |= static_cast<uint8_t>(
+                        IPMISensorEventEnableThresholds::
+                            lowerCriticalGoingHigh);
                 }
             }
         }
@@ -1240,8 +1235,8 @@
                     "getSensorDataRecord: NM DiscoveryIndex error");
                 return GENERAL_ERROR;
             }
-            recordData =
-                ipmi::storage::getNMDiscoverySDR(nmDiscoveryIndex, recordID);
+            recordData = ipmi::storage::getNMDiscoverySDR(nmDiscoveryIndex,
+                                                          recordID);
         }
         else if (fruIndex >= fruCount)
         {
@@ -1447,8 +1442,8 @@
     uint8_t bExpBits = bExp & 0x07;
 
     // move rExp and bExp into place
-    record.body.r_b_exponents =
-        (rExpSign << 7) | (rExpBits << 4) | (bExpSign << 3) | bExpBits;
+    record.body.r_b_exponents = (rExpSign << 7) | (rExpBits << 4) |
+                                (bExpSign << 3) | bExpBits;
 
     // Set the analog reading byte interpretation accordingly
     record.body.sensor_units_1 = (bSigned ? 1 : 0) << 7;
@@ -1608,8 +1603,8 @@
         // Return the number of sensors attached to the LUN
         if ((ctx->lun == 0) && (numSensors > 0))
         {
-            sdrCount =
-                (numSensors > maxSensorsPerLUN) ? maxSensorsPerLUN : numSensors;
+            sdrCount = (numSensors > maxSensorsPerLUN) ? maxSensorsPerLUN
+                                                       : numSensors;
         }
         else if ((ctx->lun == 1) && (numSensors > maxSensorsPerLUN))
         {
@@ -1621,8 +1616,8 @@
         {
             if (numSensors <= maxIPMISensors)
             {
-                sdrCount =
-                    (numSensors - (2 * maxSensorsPerLUN)) & maxSensorsPerLUN;
+                sdrCount = (numSensors - (2 * maxSensorsPerLUN)) &
+                           maxSensorsPerLUN;
             }
             else
             {
@@ -1797,8 +1792,8 @@
         return ipmi::responseSuccess(nextRecordId, record);
     }
 
-    size_t sdrLength =
-        sizeof(get_sdr::SensorDataRecordHeader) + hdr->record_length;
+    size_t sdrLength = sizeof(get_sdr::SensorDataRecordHeader) +
+                       hdr->record_length;
     if (sdrLength < (offset + bytesToRead))
     {
         bytesToRead = sdrLength - offset;
diff --git a/src/smbiosmdrv2handler.cpp b/src/smbiosmdrv2handler.cpp
index c5d00a1..fac3d94 100644
--- a/src/smbiosmdrv2handler.cpp
+++ b/src/smbiosmdrv2handler.cpp
@@ -738,7 +738,6 @@
                                   uint32_t xferOffset, uint32_t xferLength,
                                   uint32_t checksum)
 {
-
     if (mdrv2 == nullptr)
     {
         mdrv2 = std::make_unique<MDRV2>();
@@ -786,8 +785,8 @@
                 "Offset is out of range");
             return ipmi::responseParmOutOfRange();
         }
-        uint8_t* destAddr =
-            mdrv2->smbiosDir.dir[idIndex].dataStorage + xferOffset;
+        uint8_t* destAddr = mdrv2->smbiosDir.dir[idIndex].dataStorage +
+                            xferOffset;
         uint8_t* sourceAddr = reinterpret_cast<uint8_t*>(mdrv2->area->vPtr);
         uint32_t calcChecksum = mdrv2->calcChecksum32(sourceAddr, xferLength);
         if (calcChecksum != checksum)
@@ -1144,8 +1143,8 @@
     {
         try
         {
-            mdrv2->area =
-                std::make_unique<SharedMemoryArea>(xferAddress, xferLength);
+            mdrv2->area = std::make_unique<SharedMemoryArea>(xferAddress,
+                                                             xferLength);
         }
         catch (const std::system_error& e)
         {
@@ -1187,7 +1186,6 @@
 **/
 ipmi::RspType<> cmd_mdr2_data_done(uint16_t agentId, uint16_t lockHandle)
 {
-
     if (mdrv2 == nullptr)
     {
         mdrv2 = std::make_unique<MDRV2>();
diff --git a/src/storagecommands.cpp b/src/storagecommands.cpp
index ec8df36..2554174 100644
--- a/src/storagecommands.cpp
+++ b/src/storagecommands.cpp
@@ -163,7 +163,6 @@
 
 void recalculateHashes()
 {
-
     deviceHashes.clear();
     devicePath.clear();
     // hash the object paths to create unique device id's. increment on
@@ -383,53 +382,51 @@
                             "type='signal',arg0path='/xyz/openbmc_project/"
                             "FruDevice/',member='InterfacesAdded'",
                             [](sdbusplus::message_t& message) {
-                                sdbusplus::message::object_path path;
-                                ObjectType object;
-                                try
-                                {
-                                    message.read(path, object);
-                                }
-                                catch (const sdbusplus::exception_t&)
-                                {
-                                    return;
-                                }
-                                auto findType = object.find(
-                                    "xyz.openbmc_project.FruDevice");
-                                if (findType == object.end())
-                                {
-                                    return;
-                                }
-                                writeFruIfRunning();
-                                frus[path] = object;
-                                recalculateHashes();
-                                lastDevId = 0xFF;
-                            });
+        sdbusplus::message::object_path path;
+        ObjectType object;
+        try
+        {
+            message.read(path, object);
+        }
+        catch (const sdbusplus::exception_t&)
+        {
+            return;
+        }
+        auto findType = object.find("xyz.openbmc_project.FruDevice");
+        if (findType == object.end())
+        {
+            return;
+        }
+        writeFruIfRunning();
+        frus[path] = object;
+        recalculateHashes();
+        lastDevId = 0xFF;
+    });
 
     fruMatches.emplace_back(*bus,
                             "type='signal',arg0path='/xyz/openbmc_project/"
                             "FruDevice/',member='InterfacesRemoved'",
                             [](sdbusplus::message_t& message) {
-                                sdbusplus::message::object_path path;
-                                std::set<std::string> interfaces;
-                                try
-                                {
-                                    message.read(path, interfaces);
-                                }
-                                catch (const sdbusplus::exception_t&)
-                                {
-                                    return;
-                                }
-                                auto findType = interfaces.find(
-                                    "xyz.openbmc_project.FruDevice");
-                                if (findType == interfaces.end())
-                                {
-                                    return;
-                                }
-                                writeFruIfRunning();
-                                frus.erase(path);
-                                recalculateHashes();
-                                lastDevId = 0xFF;
-                            });
+        sdbusplus::message::object_path path;
+        std::set<std::string> interfaces;
+        try
+        {
+            message.read(path, interfaces);
+        }
+        catch (const sdbusplus::exception_t&)
+        {
+            return;
+        }
+        auto findType = interfaces.find("xyz.openbmc_project.FruDevice");
+        if (findType == interfaces.end())
+        {
+            return;
+        }
+        writeFruIfRunning();
+        frus.erase(path);
+        recalculateHashes();
+        lastDevId = 0xFF;
+    });
 
     // call once to populate
     boost::asio::spawn(*getIoContext(), [](boost::asio::yield_context yield) {
@@ -642,34 +639,31 @@
     uint8_t& address = device->second.second;
 
     boost::container::flat_map<std::string, DbusVariant>* fruData = nullptr;
-    auto fru =
-        std::find_if(frus.begin(), frus.end(),
-                     [bus, address, &fruData](ManagedEntry& entry) {
-                         auto findFruDevice =
-                             entry.second.find("xyz.openbmc_project.FruDevice");
-                         if (findFruDevice == entry.second.end())
-                         {
-                             return false;
-                         }
-                         fruData = &(findFruDevice->second);
-                         auto findBus = findFruDevice->second.find("BUS");
-                         auto findAddress =
-                             findFruDevice->second.find("ADDRESS");
-                         if (findBus == findFruDevice->second.end() ||
-                             findAddress == findFruDevice->second.end())
-                         {
-                             return false;
-                         }
-                         if (std::get<uint32_t>(findBus->second) != bus)
-                         {
-                             return false;
-                         }
-                         if (std::get<uint32_t>(findAddress->second) != address)
-                         {
-                             return false;
-                         }
-                         return true;
-                     });
+    auto fru = std::find_if(frus.begin(), frus.end(),
+                            [bus, address, &fruData](ManagedEntry& entry) {
+        auto findFruDevice = entry.second.find("xyz.openbmc_project.FruDevice");
+        if (findFruDevice == entry.second.end())
+        {
+            return false;
+        }
+        fruData = &(findFruDevice->second);
+        auto findBus = findFruDevice->second.find("BUS");
+        auto findAddress = findFruDevice->second.find("ADDRESS");
+        if (findBus == findFruDevice->second.end() ||
+            findAddress == findFruDevice->second.end())
+        {
+            return false;
+        }
+        if (std::get<uint32_t>(findBus->second) != bus)
+        {
+            return false;
+        }
+        if (std::get<uint32_t>(findAddress->second) != address)
+        {
+            return false;
+        }
+        return true;
+    });
     if (fru == frus.end())
     {
         return IPMI_CC_RESPONSE_ERROR;
@@ -695,42 +689,42 @@
         return ipmi::ccResponseError;
     }
 
-    auto entity = std::find_if(
-        entities.begin(), entities.end(),
-        [bus, address, &entityData](ManagedEntry& entry) {
-            auto findFruDevice = entry.second.find(
-                "xyz.openbmc_project.Inventory.Decorator.FruDevice");
-            if (findFruDevice == entry.second.end())
-            {
-                return false;
-            }
+    auto entity =
+        std::find_if(entities.begin(), entities.end(),
+                     [bus, address, &entityData](ManagedEntry& entry) {
+        auto findFruDevice = entry.second.find(
+            "xyz.openbmc_project.Inventory.Decorator.FruDevice");
+        if (findFruDevice == entry.second.end())
+        {
+            return false;
+        }
 
-            // Integer fields added via Entity-Manager json are uint64_ts by
-            // default.
-            auto findBus = findFruDevice->second.find("Bus");
-            auto findAddress = findFruDevice->second.find("Address");
+        // Integer fields added via Entity-Manager json are uint64_ts by
+        // default.
+        auto findBus = findFruDevice->second.find("Bus");
+        auto findAddress = findFruDevice->second.find("Address");
 
-            if (findBus == findFruDevice->second.end() ||
-                findAddress == findFruDevice->second.end())
-            {
-                return false;
-            }
-            if ((std::get<uint64_t>(findBus->second) != bus) ||
-                (std::get<uint64_t>(findAddress->second) != address))
-            {
-                return false;
-            }
+        if (findBus == findFruDevice->second.end() ||
+            findAddress == findFruDevice->second.end())
+        {
+            return false;
+        }
+        if ((std::get<uint64_t>(findBus->second) != bus) ||
+            (std::get<uint64_t>(findAddress->second) != address))
+        {
+            return false;
+        }
 
-            // At this point we found the device entry and should return
-            // true.
-            auto findIpmiDevice = entry.second.find(
-                "xyz.openbmc_project.Inventory.Decorator.Ipmi");
-            if (findIpmiDevice != entry.second.end())
-            {
-                entityData = &(findIpmiDevice->second);
-            }
+        // At this point we found the device entry and should return
+        // true.
+        auto findIpmiDevice =
+            entry.second.find("xyz.openbmc_project.Inventory.Decorator.Ipmi");
+        if (findIpmiDevice != entry.second.end())
+        {
+            entityData = &(findIpmiDevice->second);
+        }
 
-            return true;
+        return true;
         });
 
     if (entity == entities.end())
@@ -959,14 +953,14 @@
     bool,     // Event Direction
     std::array<uint8_t, intel_oem::ipmi::sel::systemEventSize>>; // Event Data
 using oemTsEventType = std::tuple<
-    uint32_t,                                                   // Timestamp
-    std::array<uint8_t, intel_oem::ipmi::sel::oemTsEventSize>>; // Event Data
+    uint32_t,                                                    // Timestamp
+    std::array<uint8_t, intel_oem::ipmi::sel::oemTsEventSize>>;  // Event Data
 using oemEventType =
-    std::array<uint8_t, intel_oem::ipmi::sel::oemEventSize>; // Event Data
+    std::array<uint8_t, intel_oem::ipmi::sel::oemEventSize>;     // Event Data
 
-ipmi::RspType<uint16_t, // Next Record ID
-              uint16_t, // Record ID
-              uint8_t,  // Record Type
+ipmi::RspType<uint16_t,                   // Next Record ID
+              uint16_t,                   // Record ID
+              uint8_t,                    // Record Type
               std::variant<systemEventType, oemTsEventType,
                            oemEventType>> // Record Content
     ipmiStorageGetSELEntry(uint16_t reservationID, uint16_t targetID,
