diff --git a/src/appcommands.cpp b/src/appcommands.cpp
index 8b37a1f..10e3d13 100644
--- a/src/appcommands.cpp
+++ b/src/appcommands.cpp
@@ -16,11 +16,12 @@
 #include <byteswap.h>
 
 #include <appcommands.hpp>
-#include <fstream>
 #include <ipmid/api.hpp>
 #include <ipmid/utils.hpp>
 #include <nlohmann/json.hpp>
 #include <phosphor-logging/log.hpp>
+
+#include <fstream>
 #include <regex>
 
 namespace ipmi
diff --git a/src/bmccontrolservices.cpp b/src/bmccontrolservices.cpp
index 5073149..418deb4 100644
--- a/src/bmccontrolservices.cpp
+++ b/src/bmccontrolservices.cpp
@@ -20,6 +20,7 @@
 #include <ipmid/api.hpp>
 #include <ipmid/utils.hpp>
 #include <phosphor-logging/log.hpp>
+
 #include <variant>
 
 namespace ipmi
diff --git a/src/bridgingcommands.cpp b/src/bridgingcommands.cpp
index 3220474..2f2c3fa 100644
--- a/src/bridgingcommands.cpp
+++ b/src/bridgingcommands.cpp
@@ -14,9 +14,7 @@
 // limitations under the License.
 */
 
-#include <bitset>
 #include <bridgingcommands.hpp>
-#include <cstring>
 #include <ipmid/api.hpp>
 #include <ipmid/utils.hpp>
 #include <manufacturingcommands.hpp>
@@ -25,18 +23,21 @@
 #include <sdbusplus/bus/match.hpp>
 #include <sdbusplus/message.hpp>
 #include <storagecommands.hpp>
+
+#include <bitset>
+#include <cstring>
 #include <vector>
 
-static constexpr const char *wdtService = "xyz.openbmc_project.Watchdog";
-static constexpr const char *wdtInterface =
+static constexpr const char* wdtService = "xyz.openbmc_project.Watchdog";
+static constexpr const char* wdtInterface =
     "xyz.openbmc_project.State.Watchdog";
-static constexpr const char *wdtObjPath = "/xyz/openbmc_project/watchdog/host0";
-static constexpr const char *wdtInterruptFlagProp =
+static constexpr const char* wdtObjPath = "/xyz/openbmc_project/watchdog/host0";
+static constexpr const char* wdtInterruptFlagProp =
     "PreTimeoutInterruptOccurFlag";
 
-static constexpr const char *ipmbBus = "xyz.openbmc_project.Ipmi.Channel.Ipmb";
-static constexpr const char *ipmbObj = "/xyz/openbmc_project/Ipmi/Channel/Ipmb";
-static constexpr const char *ipmbIntf = "org.openbmc.Ipmb";
+static constexpr const char* ipmbBus = "xyz.openbmc_project.Ipmi.Channel.Ipmb";
+static constexpr const char* ipmbObj = "/xyz/openbmc_project/Ipmi/Channel/Ipmb";
+static constexpr const char* ipmbIntf = "org.openbmc.Ipmb";
 
 static Bridging bridging;
 static bool eventMessageBufferFlag = false;
@@ -49,7 +50,7 @@
 /**
  * @brief utils for checksum
  */
-static bool ipmbChecksumValidate(const uint8_t *data, uint8_t length)
+static bool ipmbChecksumValidate(const uint8_t* data, uint8_t length)
 {
     if (data == nullptr)
     {
@@ -71,7 +72,7 @@
     return false;
 }
 
-static uint8_t ipmbChecksumCompute(uint8_t *data, uint8_t length)
+static uint8_t ipmbChecksumCompute(uint8_t* data, uint8_t length)
 {
     if (data == nullptr)
     {
@@ -90,21 +91,21 @@
 }
 
 static inline bool
-    ipmbConnectionHeaderChecksumValidate(const ipmbHeader *ipmbHeader)
+    ipmbConnectionHeaderChecksumValidate(const ipmbHeader* ipmbHeader)
 {
-    return ipmbChecksumValidate(reinterpret_cast<const uint8_t *>(ipmbHeader),
+    return ipmbChecksumValidate(reinterpret_cast<const uint8_t*>(ipmbHeader),
                                 ipmbConnectionHeaderLength);
 }
 
-static inline bool ipmbDataChecksumValidate(const ipmbHeader *ipmbHeader,
+static inline bool ipmbDataChecksumValidate(const ipmbHeader* ipmbHeader,
                                             uint8_t length)
 {
-    return ipmbChecksumValidate((reinterpret_cast<const uint8_t *>(ipmbHeader) +
+    return ipmbChecksumValidate((reinterpret_cast<const uint8_t*>(ipmbHeader) +
                                  ipmbConnectionHeaderLength),
                                 (length - ipmbConnectionHeaderLength));
 }
 
-static bool isFrameValid(const ipmbHeader *frame, uint8_t length)
+static bool isFrameValid(const ipmbHeader* frame, uint8_t length)
 {
     if ((length < ipmbMinFrameLength) || (length > ipmbMaxFrameLength))
     {
@@ -124,7 +125,7 @@
     return true;
 }
 
-IpmbRequest::IpmbRequest(const ipmbHeader *ipmbBuffer, size_t bufferLength)
+IpmbRequest::IpmbRequest(const ipmbHeader* ipmbBuffer, size_t bufferLength)
 {
     address = ipmbBuffer->Header.Req.address;
     netFn = ipmbNetFnGet(ipmbBuffer->Header.Req.rsNetFnLUN);
@@ -148,7 +149,7 @@
 IpmbResponse::IpmbResponse(uint8_t address, uint8_t netFn, uint8_t rqLun,
                            uint8_t rsSA, uint8_t seq, uint8_t rsLun,
                            uint8_t cmd, uint8_t completionCode,
-                           std::vector<uint8_t> &inputData) :
+                           std::vector<uint8_t>& inputData) :
     address(address),
     netFn(netFn), rqLun(rqLun), rsSA(rsSA), seq(seq), rsLun(rsLun), cmd(cmd),
     completionCode(completionCode)
@@ -161,9 +162,9 @@
     }
 }
 
-void IpmbResponse::ipmbToi2cConstruct(uint8_t *buffer, size_t *bufferLength)
+void IpmbResponse::ipmbToi2cConstruct(uint8_t* buffer, size_t* bufferLength)
 {
-    ipmbHeader *ipmbBuffer = (ipmbHeader *)buffer;
+    ipmbHeader* ipmbBuffer = (ipmbHeader*)buffer;
 
     ipmbBuffer->Header.Resp.address = address;
     ipmbBuffer->Header.Resp.rqNetFnLUN = ipmbNetFnLunSet(netFn, rqLun);
@@ -190,7 +191,7 @@
                             (ipmbResponseDataHeaderLength + data.size()));
 }
 
-void IpmbRequest::prepareRequest(sdbusplus::message::message &mesg)
+void IpmbRequest::prepareRequest(sdbusplus::message::message& mesg)
 {
     mesg.append(ipmbMeChannelNum, netFn, rqLun, cmd, data);
 }
@@ -240,8 +241,8 @@
 
 ipmi::Cc Bridging::handleIpmbChannel(ipmi::Context::ptr ctx,
                                      const uint8_t tracking,
-                                     const std::vector<uint8_t> &msgData,
-                                     std::vector<uint8_t> &rspData)
+                                     const std::vector<uint8_t>& msgData,
+                                     std::vector<uint8_t>& rspData)
 {
     ipmi::Manufacturing mtm;
 
@@ -259,7 +260,7 @@
         return ipmi::ccInsufficientPrivilege;
     }
 
-    auto sendMsgReqData = reinterpret_cast<const ipmbHeader *>(msgData.data());
+    auto sendMsgReqData = reinterpret_cast<const ipmbHeader*>(msgData.data());
 
     // allow bridging to ME only
     if (sendMsgReqData->Header.Req.address != ipmbMeSlaveAddress)
@@ -394,7 +395,7 @@
     ipmiAppSendMessage(ipmi::Context::ptr ctx, const uint4_t channelNumber,
                        const bool authenticationEnabled,
                        const bool encryptionEnabled, const uint2_t tracking,
-                       ipmi::message::Payload &msg)
+                       ipmi::message::Payload& msg)
 {
     // check message fields:
     // encryption not supported
@@ -546,7 +547,7 @@
             getMsgFlagsRes.set(getMsgFlagWatchdogPreTimeOutBit);
         }
     }
-    catch (sdbusplus::exception::SdBusError &e)
+    catch (sdbusplus::exception::SdBusError& e)
     {
         phosphor::logging::log<phosphor::logging::level::ERR>(
             "ipmiAppGetMessageFlags, dbus call exception");
@@ -595,7 +596,7 @@
         ipmi::setDbusProperty(*dbus, wdtService, wdtObjPath, wdtInterface,
                               wdtInterruptFlagProp, false);
     }
-    catch (const sdbusplus::exception::SdBusError &e)
+    catch (const sdbusplus::exception::SdBusError& e)
     {
         phosphor::logging::log<phosphor::logging::level::ERR>(
             "ipmiAppClearMessageFlags: can't Clear/Set "
diff --git a/src/chassiscommands.cpp b/src/chassiscommands.cpp
index 24e3322..1ff29c2 100644
--- a/src/chassiscommands.cpp
+++ b/src/chassiscommands.cpp
@@ -15,18 +15,19 @@
 */
 #include "xyz/openbmc_project/Common/error.hpp"
 
-#include <fstream>
-#include <iostream>
 #include <ipmid/api.hpp>
 #include <ipmid/utils.hpp>
 #include <nlohmann/json.hpp>
 #include <phosphor-logging/elog-errors.hpp>
 #include <phosphor-logging/log.hpp>
-#include <regex>
 #include <sdbusplus/timer.hpp>
+#include <xyz/openbmc_project/Control/Power/RestorePolicy/server.hpp>
+
+#include <fstream>
+#include <iostream>
+#include <regex>
 #include <stdexcept>
 #include <string_view>
-#include <xyz/openbmc_project/Control/Power/RestorePolicy/server.hpp>
 
 using namespace phosphor::logging;
 
diff --git a/src/firmware-update.cpp b/src/firmware-update.cpp
index afb1662..04ed4e9 100644
--- a/src/firmware-update.cpp
+++ b/src/firmware-update.cpp
@@ -11,21 +11,22 @@
 #include <boost/process/child.hpp>
 #include <boost/uuid/random_generator.hpp>
 #include <boost/uuid/uuid_io.hpp>
-#include <chrono>
 #include <commandutils.hpp>
-#include <cstdint>
-#include <filesystem>
-#include <fstream>
-#include <iostream>
 #include <ipmid/api.hpp>
 #include <ipmid/utils.hpp>
-#include <map>
 #include <phosphor-logging/log.hpp>
-#include <random>
 #include <sdbusplus/bus.hpp>
 #include <sdbusplus/bus/match.hpp>
 #include <sdbusplus/server/object.hpp>
 #include <sdbusplus/timer.hpp>
+
+#include <chrono>
+#include <cstdint>
+#include <filesystem>
+#include <fstream>
+#include <iostream>
+#include <map>
+#include <random>
 #ifdef INTEL_PFR_ENABLED
 #include <spiDev.hpp>
 #endif
@@ -68,11 +69,11 @@
 }
 } // namespace ipmi
 
-static constexpr const char *bmcStateIntf = "xyz.openbmc_project.State.BMC";
-static constexpr const char *bmcStatePath = "/xyz/openbmc_project/state/bmc0";
-static constexpr const char *bmcStateReady =
+static constexpr const char* bmcStateIntf = "xyz.openbmc_project.State.BMC";
+static constexpr const char* bmcStatePath = "/xyz/openbmc_project/state/bmc0";
+static constexpr const char* bmcStateReady =
     "xyz.openbmc_project.State.BMC.BMCState.Ready";
-static constexpr const char *bmcStateUpdateInProgress =
+static constexpr const char* bmcStateUpdateInProgress =
     "xyz.openbmc_project.State.BMC.BMCState.UpdateInProgress";
 
 static constexpr char firmwareBufferFile[] = "/tmp/fw-download.bin";
@@ -92,8 +93,8 @@
 bool block0Mapped = false;
 static constexpr uint32_t perBlock0MagicNum = 0xB6EAFD19;
 
-static constexpr const char *bmcActivePfmMTDDev = "/dev/mtd/pfm";
-static constexpr const char *bmcRecoveryImgMTDDev = "/dev/mtd/rc-image";
+static constexpr const char* bmcActivePfmMTDDev = "/dev/mtd/pfm";
+static constexpr const char* bmcRecoveryImgMTDDev = "/dev/mtd/rc-image";
 static constexpr size_t pfmBaseOffsetInImage = 0x400;
 static constexpr size_t rootkeyOffsetInPfm = 0xA0;
 static constexpr size_t cskKeyOffsetInPfm = 0x124;
@@ -101,7 +102,7 @@
 static constexpr size_t certKeyLen = 96;
 static constexpr size_t cskSignatureLen = 96;
 
-static constexpr const char *versionIntf =
+static constexpr const char* versionIntf =
     "xyz.openbmc_project.Software.Version";
 
 enum class FwGetRootCertDataTag : uint8_t
@@ -118,7 +119,7 @@
     bmcRecoveryImage,
 };
 
-const static boost::container::flat_map<FWDeviceIDTag, const char *>
+const static boost::container::flat_map<FWDeviceIDTag, const char*>
     fwVersionIdMap{{FWDeviceIDTag::bmcActiveImage,
                     "/xyz/openbmc_project/software/bmc_active"},
                    {FWDeviceIDTag::bmcRecoveryImage,
@@ -179,15 +180,14 @@
     };
 
   protected:
-    EVP_MD_CTX *ctx;
+    EVP_MD_CTX* ctx;
     std::vector<uint8_t> expectedHash;
     enum HashCheck check;
     bool started;
 
   public:
     TransferHashCheck() : check(HashCheck::notRequested), started(false)
-    {
-    }
+    {}
     ~TransferHashCheck()
     {
         if (ctx)
@@ -196,14 +196,14 @@
             ctx = NULL;
         }
     }
-    void init(const std::vector<uint8_t> &expected)
+    void init(const std::vector<uint8_t>& expected)
     {
         expectedHash = expected;
         check = HashCheck::requested;
         ctx = EVP_MD_CTX_create();
         EVP_DigestInit(ctx, EVP_sha256());
     }
-    void hash(const std::vector<uint8_t> &data)
+    void hash(const std::vector<uint8_t>& data)
     {
         if (!started)
         {
@@ -259,7 +259,7 @@
 class MappedFile
 {
   public:
-    MappedFile(const std::string &fname) : addr(nullptr), fsize(0)
+    MappedFile(const std::string& fname) : addr(nullptr), fsize(0)
     {
         std::error_code ec;
         size_t sz = std::filesystem::file_size(fname, ec);
@@ -268,7 +268,7 @@
         {
             return;
         }
-        void *tmp = mmap(NULL, sz, PROT_READ, MAP_SHARED, fd, 0);
+        void* tmp = mmap(NULL, sz, PROT_READ, MAP_SHARED, fd, 0);
         close(fd);
         if (tmp == MAP_FAILED)
         {
@@ -285,9 +285,9 @@
             munmap(addr, fsize);
         }
     }
-    const uint8_t *data() const
+    const uint8_t* data() const
     {
-        return static_cast<const uint8_t *>(addr);
+        return static_cast<const uint8_t*>(addr);
     }
     size_t size() const
     {
@@ -296,7 +296,7 @@
 
   private:
     size_t fsize;
-    void *addr;
+    void* addr;
 };
 
 class FwUpdateStatusCache
@@ -351,7 +351,7 @@
     {
         return progressPercent;
     }
-    void updateActivationPercent(const std::string &objPath)
+    void updateActivationPercent(const std::string& objPath)
     {
         std::shared_ptr<sdbusplus::asio::connection> busp = getSdBus();
         fwUpdateState = fwStateProgram;
@@ -360,7 +360,7 @@
             *busp,
             sdbusplus::bus::match::rules::propertiesChanged(
                 objPath, "xyz.openbmc_project.Software.ActivationProgress"),
-            [&](sdbusplus::message::message &msg) {
+            [&](sdbusplus::message::message& msg) {
                 std::map<std::string, ipmi::DbusVariant> props;
                 std::vector<std::string> inVal;
                 std::string iface;
@@ -368,7 +368,7 @@
                 {
                     msg.read(iface, props, inVal);
                 }
-                catch (const std::exception &e)
+                catch (const std::exception& e)
                 {
                     phosphor::logging::log<phosphor::logging::level::ERR>(
                         "Exception caught in get ActivationProgress");
@@ -435,7 +435,7 @@
 static FwUpdateStatusCache fwUpdateStatus;
 std::shared_ptr<TransferHashCheck> xferHashCheck;
 
-static void activateImage(const std::string &objPath)
+static void activateImage(const std::string& objPath)
 {
     // If flag is false  means to reboot
     if (fwUpdateStatus.getDeferRestart() == false)
@@ -479,7 +479,7 @@
         std::string bmcState = std::get<std::string>(state);
         return (bmcState == bmcStateUpdateInProgress);
     }
-    catch (const std::exception &e)
+    catch (const std::exception& e)
     {
         phosphor::logging::log<phosphor::logging::level::ERR>(
             "Exception caught while getting BMC state.",
@@ -504,7 +504,7 @@
         ipmi::setDbusProperty(*busp, service, bmcStatePath, bmcStateIntf,
                               "CurrentBMCState", bmcState);
     }
-    catch (const std::exception &e)
+    catch (const std::exception& e)
     {
         phosphor::logging::log<phosphor::logging::level::ERR>(
             "Exception caught while setting BMC state.",
@@ -520,7 +520,7 @@
  * @param[in] ctx - context of current session.
  *  @returns true if the medium is IPMB else return true.
  **/
-ipmi::Cc checkIPMBChannel(const ipmi::Context::ptr &ctx, bool &isIPMBChannel)
+ipmi::Cc checkIPMBChannel(const ipmi::Context::ptr& ctx, bool& isIPMBChannel)
 {
     ipmi::ChannelInfo chInfo;
 
@@ -541,7 +541,7 @@
 }
 
 static void postTransferCompleteHandler(
-    std::unique_ptr<sdbusplus::bus::match::match> &fwUpdateMatchSignal)
+    std::unique_ptr<sdbusplus::bus::match::match>& fwUpdateMatchSignal)
 {
     // Setup timer for watching signal
     static phosphor::Timer timer(
@@ -559,7 +559,7 @@
     timer.start(std::chrono::microseconds(5000000), false);
 
     // callback function for capturing signal
-    auto callback = [&](sdbusplus::message::message &m) {
+    auto callback = [&](sdbusplus::message::message& m) {
         bool flag = false;
 
         std::vector<std::pair<
@@ -573,7 +573,7 @@
             m.read(objPath, intfPropsPair); // Read in the object path
                                             // that was just created
         }
-        catch (const std::exception &e)
+        catch (const std::exception& e)
         {
             phosphor::logging::log<phosphor::logging::level::ERR>(
                 "Exception caught in reading created object path.");
@@ -583,7 +583,7 @@
         phosphor::logging::log<phosphor::logging::level::INFO>(
             "New Interface Added.",
             phosphor::logging::entry("OBJPATH=%s", objPath.str.c_str()));
-        for (auto &interface : intfPropsPair)
+        for (auto& interface : intfPropsPair)
         {
             if (interface.first == "xyz.openbmc_project.Software.Activation")
             {
@@ -604,7 +604,7 @@
                     activationStatusTimer.start(
                         std::chrono::microseconds(3000000), true);
                 }
-                catch (const std::exception &e)
+                catch (const std::exception& e)
                 {
                     phosphor::logging::log<phosphor::logging::level::ERR>(
                         "Exception caught in start activationStatusTimer.",
@@ -624,7 +624,7 @@
         "member='InterfacesAdded',path='/xyz/openbmc_project/software'",
         callback);
 }
-static bool startFirmwareUpdate(const std::string &uri)
+static bool startFirmwareUpdate(const std::string& uri)
 {
     // fwupdate URIs start with file:// or usb:// or tftp:// etc. By the time
     // the code gets to this point, the file should be transferred start the
@@ -638,7 +638,7 @@
     return true;
 }
 
-static int transferImageFromFile(const std::string &uri, bool move = true)
+static int transferImageFromFile(const std::string& uri, bool move = true)
 {
     std::error_code ec;
     phosphor::logging::log<phosphor::logging::level::INFO>(
@@ -669,14 +669,14 @@
 }
 
 template <typename... ArgTypes>
-static int executeCmd(const char *path, ArgTypes &&... tArgs)
+static int executeCmd(const char* path, ArgTypes&&... tArgs)
 {
-    boost::process::child execProg(path, const_cast<char *>(tArgs)...);
+    boost::process::child execProg(path, const_cast<char*>(tArgs)...);
     execProg.wait();
     return execProg.exit_code();
 }
 
-static int transferImageFromUsb(const std::string &uri)
+static int transferImageFromUsb(const std::string& uri)
 {
     int ret, sysret;
     char fwpath[fwPathMaxLength];
@@ -697,7 +697,7 @@
     return ret;
 }
 
-static bool transferFirmwareFromUri(const std::string &uri)
+static bool transferFirmwareFromUri(const std::string& uri)
 {
     static constexpr char fwUriFile[] = "file://";
     static constexpr char fwUriUsb[] = "usb://";
@@ -761,7 +761,7 @@
     constexpr uint8_t undefinedImage = 0x00;
     constexpr uint8_t primaryImage = 0x01;
     constexpr uint8_t secondaryImage = 0x02;
-    constexpr const char *secondaryFitImageStartAddr = "22480000";
+    constexpr const char* secondaryFitImageStartAddr = "22480000";
 
     uint8_t bootImage = primaryImage;
     boost::system::error_code ec;
@@ -805,7 +805,7 @@
 
     std::vector<fwVersionInfoType> fwVerInfoList;
     std::shared_ptr<sdbusplus::asio::connection> busp = getSdBus();
-    for (const auto &fwDev : fwVersionIdMap)
+    for (const auto& fwDev : fwVersionIdMap)
     {
         std::string verStr;
         try
@@ -816,7 +816,7 @@
                 *busp, service, fwDev.second, versionIntf, "Version");
             verStr = std::get<std::string>(result);
         }
-        catch (const std::exception &e)
+        catch (const std::exception& e)
         {
             phosphor::logging::log<phosphor::logging::level::INFO>(
                 "Failed to fetch Version property",
@@ -856,7 +856,7 @@
             minorNum = std::stoul(splitVer[1], nullptr, 16);
             buildNum = std::stoul(splitVer[2], nullptr, 16);
         }
-        catch (const std::exception &e)
+        catch (const std::exception& e)
         {
             phosphor::logging::log<phosphor::logging::level::INFO>(
                 "Failed to convert stoul.",
@@ -885,7 +885,7 @@
 
 ipmi::RspType<std::array<uint8_t, certKeyLen>,
               std::optional<std::array<uint8_t, cskSignatureLen>>>
-    ipmiGetFwRootCertData(const ipmi::Context::ptr &ctx, uint8_t certId)
+    ipmiGetFwRootCertData(const ipmi::Context::ptr& ctx, uint8_t certId)
 {
     bool isIPMBChannel = false;
 
@@ -953,7 +953,7 @@
             return ipmi::responseSuccess(certKey, cskSignature);
         }
     }
-    catch (const std::exception &e)
+    catch (const std::exception& e)
     {
         phosphor::logging::log<phosphor::logging::level::ERR>(
             "Exception caught in ipmiGetFwRootCertData",
@@ -1016,7 +1016,7 @@
  *   - random number
  **/
 ipmi::RspType<std::array<uint8_t, fwRandomNumLength>>
-    ipmiGetFwUpdateRandomNumber(const ipmi::Context::ptr &ctx)
+    ipmiGetFwUpdateRandomNumber(const ipmi::Context::ptr& ctx)
 {
     phosphor::logging::log<phosphor::logging::level::INFO>(
         "Generate FW update random number");
@@ -1057,8 +1057,8 @@
  * @returns IPMI completion code
  **/
 ipmi::RspType<>
-    ipmiSetFirmwareUpdateMode(const ipmi::Context::ptr &ctx,
-                              std::array<uint8_t, fwRandomNumLength> &randNum)
+    ipmiSetFirmwareUpdateMode(const ipmi::Context::ptr& ctx,
+                              std::array<uint8_t, fwRandomNumLength>& randNum)
 {
     phosphor::logging::log<phosphor::logging::level::INFO>(
         "Start FW update mode");
@@ -1107,13 +1107,13 @@
             return ipmi::responseBusy();
         }
     }
-    catch (const std::exception &e)
+    catch (const std::exception& e)
     {
         return ipmi::responseUnspecifiedError();
     }
 
     // FIXME? c++ doesn't off an option for exclusive file creation
-    FILE *fp = fopen(firmwareBufferFile, "wx");
+    FILE* fp = fopen(firmwareBufferFile, "wx");
     if (!fp)
     {
         phosphor::logging::log<phosphor::logging::level::INFO>(
@@ -1126,7 +1126,7 @@
     {
         setFirmwareUpdateMode(true);
     }
-    catch (const std::exception &e)
+    catch (const std::exception& e)
     {
         unlink(firmwareBufferFile);
         return ipmi::responseUnspecifiedError();
@@ -1140,7 +1140,7 @@
  *
  *  @returns IPMI completion code
  */
-ipmi::RspType<> ipmiExitFirmwareUpdateMode(const ipmi::Context::ptr &ctx)
+ipmi::RspType<> ipmiExitFirmwareUpdateMode(const ipmi::Context::ptr& ctx)
 {
     phosphor::logging::log<phosphor::logging::level::INFO>(
         "Exit FW update mode");
@@ -1181,7 +1181,7 @@
     {
         setFirmwareUpdateMode(false);
     }
-    catch (const std::exception &e)
+    catch (const std::exception& e)
     {
         return ipmi::responseUnspecifiedError();
     }
@@ -1199,9 +1199,9 @@
  *   - Byte 2: Current control status
  **/
 ipmi::RspType<bool, bool, bool, bool, uint4_t>
-    ipmiGetSetFirmwareUpdateControl(const ipmi::Context::ptr &ctx,
+    ipmiGetSetFirmwareUpdateControl(const ipmi::Context::ptr& ctx,
                                     const uint8_t controlReq,
-                                    const std::optional<std::string> &fileName)
+                                    const std::optional<std::string>& fileName)
 {
     bool isIPMBChannel = false;
 
@@ -1404,7 +1404,7 @@
 }
 
 ipmi::RspType<bool, bool, bool, uint5_t> ipmiSetFirmwareUpdateOptions(
-    const ipmi::Context::ptr &ctx, bool noDowngradeMask, bool deferRestartMask,
+    const ipmi::Context::ptr& ctx, bool noDowngradeMask, bool deferRestartMask,
     bool sha2CheckMask, uint5_t reserved1, bool noDowngrade, bool deferRestart,
     bool sha2Check, uint5_t reserved2,
     std::optional<std::vector<uint8_t>> integrityCheckVal)
@@ -1463,7 +1463,7 @@
 }
 
 ipmi::RspType<uint32_t>
-    ipmiFwImageWriteData(const std::vector<uint8_t> &writeData)
+    ipmiFwImageWriteData(const std::vector<uint8_t>& writeData)
 {
     const uint8_t ccCmdNotSupportedInPresentState = 0xD5;
     size_t writeDataLen = writeData.size();
@@ -1498,7 +1498,7 @@
         return ipmi::responseInvalidFieldRequest();
     }
 
-    const char *data = reinterpret_cast<const char *>(writeData.data());
+    const char* data = reinterpret_cast<const char*>(writeData.data());
     out.write(data, writeDataLen);
     out.close();
 
@@ -1529,7 +1529,7 @@
 
         std::ifstream inFile(firmwareBufferFile,
                              std::ios::binary | std::ios::in);
-        inFile.read(reinterpret_cast<char *>(&block0Data), sizeof(block0Data));
+        inFile.read(reinterpret_cast<char*>(&block0Data), sizeof(block0Data));
         inFile.close();
 
         uint32_t magicNum = block0Data.tag;
diff --git a/src/ipmi_to_redfish_hooks.cpp b/src/ipmi_to_redfish_hooks.cpp
index 9cac813..92f9f2e 100644
--- a/src/ipmi_to_redfish_hooks.cpp
+++ b/src/ipmi_to_redfish_hooks.cpp
@@ -15,11 +15,12 @@
 */
 
 #include <boost/beast/core/span.hpp>
-#include <iomanip>
 #include <ipmi_to_redfish_hooks.hpp>
 #include <me_to_redfish_hooks.hpp>
-#include <sstream>
 #include <storagecommands.hpp>
+
+#include <iomanip>
+#include <sstream>
 #include <string_view>
 
 namespace intel_oem::ipmi::sel
diff --git a/src/manufacturingcommands.cpp b/src/manufacturingcommands.cpp
index 60199d9..3b48bb2 100644
--- a/src/manufacturingcommands.cpp
+++ b/src/manufacturingcommands.cpp
@@ -17,12 +17,13 @@
 #include <linux/input.h>
 
 #include <boost/container/flat_map.hpp>
-#include <filesystem>
-#include <fstream>
 #include <ipmid/api.hpp>
 #include <manufacturingcommands.hpp>
 #include <oemcommands.hpp>
 
+#include <filesystem>
+#include <fstream>
+
 namespace ipmi
 {
 
diff --git a/src/me_to_redfish_hooks.cpp b/src/me_to_redfish_hooks.cpp
index fac2731..c473038 100644
--- a/src/me_to_redfish_hooks.cpp
+++ b/src/me_to_redfish_hooks.cpp
@@ -17,6 +17,7 @@
 #include <boost/algorithm/string/join.hpp>
 #include <me_to_redfish_hooks.hpp>
 #include <phosphor-logging/log.hpp>
+
 #include <string_view>
 
 namespace intel_oem::ipmi::sel::redfish_hooks::me
diff --git a/src/multinodecommands.cpp b/src/multinodecommands.cpp
index 5966605..d55b2f0 100644
--- a/src/multinodecommands.cpp
+++ b/src/multinodecommands.cpp
@@ -21,6 +21,7 @@
 #include <phosphor-logging/log.hpp>
 #include <sdbusplus/bus.hpp>
 #include <sdbusplus/message/types.hpp>
+
 #include <string>
 
 namespace ipmi
diff --git a/src/oemcommands.cpp b/src/oemcommands.cpp
index 515a539..9e05308 100644
--- a/src/oemcommands.cpp
+++ b/src/oemcommands.cpp
@@ -20,26 +20,19 @@
 #include <systemd/sd-journal.h>
 
 #include <appcommands.hpp>
-#include <array>
 #include <boost/container/flat_map.hpp>
 #include <boost/process/child.hpp>
 #include <boost/process/io.hpp>
 #include <com/intel/Control/OCOTShutdownPolicy/server.hpp>
 #include <commandutils.hpp>
-#include <filesystem>
 #include <gpiod.hpp>
-#include <iostream>
 #include <ipmid/api.hpp>
 #include <ipmid/utils.hpp>
 #include <nlohmann/json.hpp>
 #include <oemcommands.hpp>
 #include <phosphor-logging/log.hpp>
-#include <regex>
 #include <sdbusplus/bus.hpp>
 #include <sdbusplus/message/types.hpp>
-#include <string>
-#include <variant>
-#include <vector>
 #include <xyz/openbmc_project/Chassis/Control/NMISource/server.hpp>
 #include <xyz/openbmc_project/Control/Boot/Mode/server.hpp>
 #include <xyz/openbmc_project/Control/Boot/Source/server.hpp>
@@ -47,6 +40,14 @@
 #include <xyz/openbmc_project/Control/Security/RestrictionMode/server.hpp>
 #include <xyz/openbmc_project/Control/Security/SpecialMode/server.hpp>
 
+#include <array>
+#include <filesystem>
+#include <iostream>
+#include <regex>
+#include <string>
+#include <variant>
+#include <vector>
+
 namespace ipmi
 {
 static void registerOEMFunctions() __attribute__((constructor));
diff --git a/src/sensorcommands.cpp b/src/sensorcommands.cpp
index 0c1840c..811cd91 100644
--- a/src/sensorcommands.cpp
+++ b/src/sensorcommands.cpp
@@ -22,21 +22,22 @@
 #include "sensorutils.hpp"
 #include "storagecommands.hpp"
 
-#include <algorithm>
-#include <array>
 #include <boost/algorithm/string.hpp>
 #include <boost/container/flat_map.hpp>
+#include <ipmid/api.hpp>
+#include <ipmid/utils.hpp>
+#include <phosphor-logging/log.hpp>
+#include <sdbusplus/bus.hpp>
+
+#include <algorithm>
+#include <array>
 #include <chrono>
 #include <cmath>
 #include <cstring>
 #include <iostream>
-#include <ipmid/api.hpp>
-#include <ipmid/utils.hpp>
 #include <map>
 #include <memory>
 #include <optional>
-#include <phosphor-logging/log.hpp>
-#include <sdbusplus/bus.hpp>
 #include <stdexcept>
 #include <string>
 #include <utility>
@@ -64,12 +65,12 @@
 // Specify the comparison required to sort and find char* map objects
 struct CmpStr
 {
-    bool operator()(const char *a, const char *b) const
+    bool operator()(const char* a, const char* b) const
     {
         return std::strcmp(a, b) < 0;
     }
 };
-const static boost::container::flat_map<const char *, SensorUnits, CmpStr>
+const static boost::container::flat_map<const char*, SensorUnits, CmpStr>
     sensorUnits{{{"temperature", SensorUnits::degreesC},
                  {"voltage", SensorUnits::volts},
                  {"current", SensorUnits::amps},
@@ -82,7 +83,7 @@
     *getSdBus(),
     "type='signal',member='InterfacesAdded',arg0path='/xyz/openbmc_project/"
     "sensors/'",
-    [](sdbusplus::message::message &m) {
+    [](sdbusplus::message::message& m) {
         sensorTree.clear();
         sdrLastAdd = std::chrono::duration_cast<std::chrono::seconds>(
                          std::chrono::system_clock::now().time_since_epoch())
@@ -93,7 +94,7 @@
     *getSdBus(),
     "type='signal',member='InterfacesRemoved',arg0path='/xyz/openbmc_project/"
     "sensors/'",
-    [](sdbusplus::message::message &m) {
+    [](sdbusplus::message::message& m) {
         sensorTree.clear();
         sdrLastRemove = std::chrono::duration_cast<std::chrono::seconds>(
                             std::chrono::system_clock::now().time_since_epoch())
@@ -110,13 +111,13 @@
     *getSdBus(),
     "type='signal',member='PropertiesChanged',interface='org.freedesktop.DBus."
     "Properties',arg0namespace='xyz.openbmc_project.Sensor.Threshold'",
-    [](sdbusplus::message::message &m) {
+    [](sdbusplus::message::message& m) {
         boost::container::flat_map<std::string, std::variant<bool, double>>
             values;
         m.read(std::string(), values);
 
         auto findAssert =
-            std::find_if(values.begin(), values.end(), [](const auto &pair) {
+            std::find_if(values.begin(), values.end(), [](const auto& pair) {
                 return pair.first.find("Alarm") != std::string::npos;
             });
         if (findAssert != values.end())
@@ -137,7 +138,7 @@
             }
             else
             {
-                auto &value =
+                auto& value =
                     thresholdDeassertMap[m.get_path()][findAssert->first];
                 if (value)
                 {
@@ -150,8 +151,8 @@
         }
     });
 
-static void getSensorMaxMin(const SensorMap &sensorMap, double &max,
-                            double &min)
+static void getSensorMaxMin(const SensorMap& sensorMap, double& max,
+                            double& min)
 {
     max = 127;
     min = -128;
@@ -211,7 +212,7 @@
 
 static bool getSensorMap(boost::asio::yield_context yield,
                          std::string sensorConnection, std::string sensorPath,
-                         SensorMap &sensorMap)
+                         SensorMap& sensorMap)
 {
     static boost::container::flat_map<
         std::string, std::chrono::time_point<std::chrono::steady_clock>>
@@ -265,13 +266,13 @@
 /* sensor commands */
 namespace meHealth
 {
-constexpr const char *busname = "xyz.openbmc_project.NodeManagerProxy";
-constexpr const char *path = "/xyz/openbmc_project/status/me";
-constexpr const char *interface = "xyz.openbmc_project.SetHealth";
-constexpr const char *method = "SetHealth";
-constexpr const char *critical = "critical";
-constexpr const char *warning = "warning";
-constexpr const char *ok = "ok";
+constexpr const char* busname = "xyz.openbmc_project.NodeManagerProxy";
+constexpr const char* path = "/xyz/openbmc_project/status/me";
+constexpr const char* interface = "xyz.openbmc_project.SetHealth";
+constexpr const char* method = "SetHealth";
+constexpr const char* critical = "critical";
+constexpr const char* warning = "warning";
+constexpr const char* ok = "ok";
 } // namespace meHealth
 
 static void setMeStatus(uint8_t eventData2, uint8_t eventData3, bool disable)
@@ -322,14 +323,14 @@
     {
         dbus->call(setHealth);
     }
-    catch (sdbusplus::exception_t &)
+    catch (sdbusplus::exception_t&)
     {
         phosphor::logging::log<phosphor::logging::level::ERR>(
             "Failed to set ME Health");
     }
 }
 
-ipmi::RspType<> ipmiSenPlatformEvent(ipmi::message::Payload &p)
+ipmi::RspType<> ipmiSenPlatformEvent(ipmi::message::Payload& p)
 {
     constexpr const uint8_t meId = 0x2C;
     constexpr const uint8_t meSensorNum = 0x17;
@@ -408,7 +409,7 @@
     {
         return ipmi::responseResponseError();
     }
-    auto &valueVariant = sensorObject->second["Value"];
+    auto& valueVariant = sensorObject->second["Value"];
     double reading = std::visit(VariantToDoubleVisitor(), valueVariant);
 
     double max = 0;
@@ -630,7 +631,7 @@
                                          findThreshold->first);
         }
     }
-    for (const auto &property : thresholdsToSet)
+    for (const auto& property : thresholdsToSet)
     {
         // from section 36.3 in the IPMI Spec, assume all linear
         double valueToSet = ((mValue * std::get<thresholdValue>(property)) +
@@ -643,7 +644,7 @@
     return ipmi::responseSuccess();
 }
 
-IPMIThresholds getIPMIThresholds(const SensorMap &sensorMap)
+IPMIThresholds getIPMIThresholds(const SensorMap& sensorMap)
 {
     IPMIThresholds resp;
     auto warningInterface =
@@ -679,7 +680,7 @@
         }
         if (warningInterface != sensorMap.end())
         {
-            auto &warningMap = warningInterface->second;
+            auto& warningMap = warningInterface->second;
 
             auto warningHigh = warningMap.find("WarningHigh");
             auto warningLow = warningMap.find("WarningLow");
@@ -702,7 +703,7 @@
         }
         if (criticalInterface != sensorMap.end())
         {
-            auto &criticalMap = criticalInterface->second;
+            auto& criticalMap = criticalInterface->second;
 
             auto criticalHigh = criticalMap.find("CriticalHigh");
             auto criticalLow = criticalMap.find("CriticalLow");
@@ -756,7 +757,7 @@
     {
         thresholdData = getIPMIThresholds(sensorMap);
     }
-    catch (std::exception &)
+    catch (std::exception&)
     {
         return ipmi::responseResponseError();
     }
@@ -851,7 +852,7 @@
             IPMISensorEventEnableByte2::sensorScanningEnable);
         if (warningInterface != sensorMap.end())
         {
-            auto &warningMap = warningInterface->second;
+            auto& warningMap = warningInterface->second;
 
             auto warningHigh = warningMap.find("WarningHigh");
             auto warningLow = warningMap.find("WarningLow");
@@ -872,7 +873,7 @@
         }
         if (criticalInterface != sensorMap.end())
         {
-            auto &criticalMap = criticalInterface->second;
+            auto& criticalMap = criticalInterface->second;
 
             auto criticalHigh = criticalMap.find("CriticalHigh");
             auto criticalLow = criticalMap.find("CriticalLow");
@@ -985,7 +986,7 @@
             IPMISensorEventEnableByte2::eventMessagesEnable);
         if (warningInterface != sensorMap.end())
         {
-            auto &warningMap = warningInterface->second;
+            auto& warningMap = warningInterface->second;
 
             auto warningHigh = warningMap.find("WarningAlarmHigh");
             auto warningLow = warningMap.find("WarningAlarmLow");
@@ -1015,7 +1016,7 @@
         }
         if (criticalInterface != sensorMap.end())
         {
-            auto &criticalMap = criticalInterface->second;
+            auto& criticalMap = criticalInterface->second;
 
             auto criticalHigh = criticalMap.find("CriticalAlarmHigh");
             auto criticalLow = criticalMap.find("CriticalAlarmLow");
@@ -1237,7 +1238,7 @@
                 bytesToRead = sizeof(data) - offset;
             }
 
-            uint8_t *respStart = reinterpret_cast<uint8_t *>(&data) + offset;
+            uint8_t* respStart = reinterpret_cast<uint8_t*>(&data) + offset;
             recordData.insert(recordData.end(), respStart,
                               respStart + bytesToRead);
         }
@@ -1248,7 +1249,7 @@
     std::string connection;
     std::string path;
     uint16_t sensorIndex = recordID;
-    for (const auto &sensor : sensorTree)
+    for (const auto& sensor : sensorTree)
     {
         if (sensorIndex-- == 0)
         {
@@ -1399,10 +1400,10 @@
     if (name.size() > FULL_RECORD_ID_STR_MAX_LENGTH)
     {
         // try to not truncate by replacing common words
-        constexpr std::array<std::pair<const char *, const char *>, 2>
+        constexpr std::array<std::pair<const char*, const char*>, 2>
             replaceWords = {std::make_pair("Output", "Out"),
                             std::make_pair("Input", "In")};
-        for (const auto &[find, replace] : replaceWords)
+        for (const auto& [find, replace] : replaceWords)
         {
             boost::replace_all(name, find, replace);
         }
@@ -1418,7 +1419,7 @@
     {
         thresholdData = getIPMIThresholds(sensorMap);
     }
-    catch (std::exception &)
+    catch (std::exception&)
     {
         return ipmi::responseResponseError();
     }
@@ -1481,7 +1482,7 @@
         bytesToRead = sizeof(get_sdr::SensorDataFullRecord) - offset;
     }
 
-    uint8_t *respStart = reinterpret_cast<uint8_t *>(&record) + offset;
+    uint8_t* respStart = reinterpret_cast<uint8_t*>(&record) + offset;
     std::vector<uint8_t> recordData(respStart, respStart + bytesToRead);
 
     return ipmi::responseSuccess(nextRecordId, recordData);
diff --git a/src/smbioshandler.cpp b/src/smbioshandler.cpp
index aeaba5c..e330e5a 100644
--- a/src/smbioshandler.cpp
+++ b/src/smbioshandler.cpp
@@ -15,16 +15,17 @@
 */
 
 #include <commandutils.hpp>
-#include <cstdint>
-#include <iostream>
 #include <ipmid/api.hpp>
 #include <ipmid/utils.hpp>
 #include <phosphor-logging/elog-errors.hpp>
 #include <phosphor-logging/log.hpp>
 #include <smbioshandler.hpp>
+#include <xyz/openbmc_project/Common/error.hpp>
+
+#include <cstdint>
+#include <iostream>
 #include <string>
 #include <vector>
-#include <xyz/openbmc_project/Common/error.hpp>
 
 using InternalFailure =
     sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
diff --git a/src/smbiosmdrv2handler.cpp b/src/smbiosmdrv2handler.cpp
index a33d0b2..52cd78f 100644
--- a/src/smbiosmdrv2handler.cpp
+++ b/src/smbiosmdrv2handler.cpp
@@ -22,17 +22,18 @@
 #include <unistd.h>
 
 #include <commandutils.hpp>
-#include <cstdint>
-#include <fstream>
 #include <ipmid/api.hpp>
 #include <ipmid/utils.hpp>
 #include <oemcommands.hpp>
 #include <phosphor-logging/log.hpp>
 #include <sdbusplus/message/types.hpp>
 #include <smbiosmdrv2handler.hpp>
+#include <xyz/openbmc_project/Common/error.hpp>
+
+#include <cstdint>
+#include <fstream>
 #include <string>
 #include <vector>
-#include <xyz/openbmc_project/Common/error.hpp>
 
 std::unique_ptr<MDRV2> mdrv2 = nullptr;
 static constexpr const uint8_t ccOemInvalidChecksum = 0x85;
@@ -41,7 +42,7 @@
 
 static void register_netfn_smbiosmdrv2_functions() __attribute__((constructor));
 
-int MDRV2::agentLookup(const uint16_t &agentId)
+int MDRV2::agentLookup(const uint16_t& agentId)
 {
     int agentIndex = -1;
 
@@ -58,9 +59,9 @@
     return agentIndex;
 }
 
-int MDRV2::sdplusMdrv2GetProperty(const std::string &name,
-                                  std::variant<uint8_t> &value,
-                                  const std::string &service)
+int MDRV2::sdplusMdrv2GetProperty(const std::string& name,
+                                  std::variant<uint8_t>& value,
+                                  const std::string& service)
 {
     std::shared_ptr<sdbusplus::asio::connection> bus = getSdBus();
     sdbusplus::message::message method =
@@ -74,7 +75,7 @@
         sdbusplus::message::message reply = bus->call(method);
         reply.read(value);
     }
-    catch (sdbusplus::exception_t &e)
+    catch (sdbusplus::exception_t& e)
     {
         phosphor::logging::log<phosphor::logging::level::ERR>(
             "Error get property, sdbusplus call failed",
@@ -86,7 +87,7 @@
 }
 
 int MDRV2::syncDirCommonData(uint8_t idIndex, uint32_t size,
-                             const std::string &service)
+                             const std::string& service)
 {
     std::vector<uint32_t> commonData;
     std::shared_ptr<sdbusplus::asio::connection> bus = getSdBus();
@@ -100,7 +101,7 @@
         sdbusplus::message::message reply = bus->call(method);
         reply.read(commonData);
     }
-    catch (sdbusplus::exception_t &e)
+    catch (sdbusplus::exception_t& e)
     {
         phosphor::logging::log<phosphor::logging::level::ERR>(
             "Error sync dir common data with service",
@@ -121,8 +122,8 @@
     return 0;
 }
 
-int MDRV2::findDataId(const uint8_t *dataInfo, const size_t &len,
-                      const std::string &service)
+int MDRV2::findDataId(const uint8_t* dataInfo, const size_t& len,
+                      const std::string& service)
 {
     int idIndex = -1;
 
@@ -146,7 +147,7 @@
         sdbusplus::message::message reply = bus->call(method);
         reply.read(idIndex);
     }
-    catch (sdbusplus::exception_t &e)
+    catch (sdbusplus::exception_t& e)
     {
         phosphor::logging::log<phosphor::logging::level::ERR>(
             "Error find id index",
@@ -159,7 +160,7 @@
     return idIndex;
 }
 
-uint16_t MDRV2::getSessionHandle(Mdr2DirStruct *dir)
+uint16_t MDRV2::getSessionHandle(Mdr2DirStruct* dir)
 {
     if (dir == NULL)
     {
@@ -176,7 +177,7 @@
     return dir->sessionHandle;
 }
 
-int MDRV2::findLockHandle(const uint16_t &lockHandle)
+int MDRV2::findLockHandle(const uint16_t& lockHandle)
 {
     int idIndex = -1;
 
@@ -205,7 +206,7 @@
     return false;
 }
 
-uint32_t MDRV2::calcChecksum32(uint8_t *buf, uint32_t len)
+uint32_t MDRV2::calcChecksum32(uint8_t* buf, uint32_t len)
 {
     uint32_t sum = 0;
 
@@ -319,7 +320,7 @@
         sdbusplus::message::message reply = bus->call(method);
         reply.read(dataOut);
     }
-    catch (sdbusplus::exception_t &e)
+    catch (sdbusplus::exception_t& e)
     {
         phosphor::logging::log<phosphor::logging::level::ERR>(
             "Error get dir", phosphor::logging::entry("ERROR=%s", e.what()),
@@ -388,7 +389,7 @@
         sdbusplus::message::message reply = bus->call(method);
         reply.read(terminate);
     }
-    catch (sdbusplus::exception_t &e)
+    catch (sdbusplus::exception_t& e)
     {
         phosphor::logging::log<phosphor::logging::level::ERR>(
             "Error send dir", phosphor::logging::entry("ERROR=%s", e.what()),
@@ -454,7 +455,7 @@
         sdbusplus::message::message reply = bus->call(method);
         reply.read(res);
     }
-    catch (sdbusplus::exception_t &e)
+    catch (sdbusplus::exception_t& e)
     {
         phosphor::logging::log<phosphor::logging::level::ERR>(
             "Error get data info",
@@ -507,7 +508,7 @@
         sdbusplus::message::message reply = bus->call(method);
         reply.read(dataOut);
     }
-    catch (sdbusplus::exception_t &e)
+    catch (sdbusplus::exception_t& e)
     {
         phosphor::logging::log<phosphor::logging::level::ERR>(
             "Error send data info offer",
@@ -588,7 +589,7 @@
         sdbusplus::message::message reply = bus->call(method);
         reply.read(entryChanged);
     }
-    catch (sdbusplus::exception_t &e)
+    catch (sdbusplus::exception_t& e)
     {
         phosphor::logging::log<phosphor::logging::level::ERR>(
             "Error send data info",
@@ -760,9 +761,9 @@
                 "Offset is out of range");
             return ipmi::responseParmOutOfRange();
         }
-        uint8_t *destAddr =
+        uint8_t* destAddr =
             mdrv2->smbiosDir.dir[idIndex].dataStorage + xferOffset;
-        uint8_t *sourceAddr = reinterpret_cast<uint8_t *>(mdrv2->area->vPtr);
+        uint8_t* sourceAddr = reinterpret_cast<uint8_t*>(mdrv2->area->vPtr);
         uint32_t calcChecksum = mdrv2->calcChecksum32(sourceAddr, xferLength);
         if (calcChecksum != checksum)
         {
@@ -791,7 +792,7 @@
     return ipmi::responseSuccess();
 }
 
-bool MDRV2::storeDatatoFlash(MDRSMBIOSHeader *mdrHdr, uint8_t *data)
+bool MDRV2::storeDatatoFlash(MDRSMBIOSHeader* mdrHdr, uint8_t* data)
 {
     std::ofstream smbiosFile(mdrType2File,
                              std::ios_base::binary | std::ios_base::trunc);
@@ -804,11 +805,11 @@
 
     try
     {
-        smbiosFile.write(reinterpret_cast<char *>(mdrHdr),
+        smbiosFile.write(reinterpret_cast<char*>(mdrHdr),
                          sizeof(MDRSMBIOSHeader));
-        smbiosFile.write(reinterpret_cast<char *>(data), mdrHdr->dataSize);
+        smbiosFile.write(reinterpret_cast<char*>(data), mdrHdr->dataSize);
     }
-    catch (std::ofstream::failure &e)
+    catch (std::ofstream::failure& e)
     {
         phosphor::logging::log<phosphor::logging::level::ERR>(
             "Write data from flash error - write data error",
@@ -882,7 +883,7 @@
     return ret;
 }
 
-bool MDRV2::smbiosTryLock(uint8_t flag, uint8_t index, uint16_t *session,
+bool MDRV2::smbiosTryLock(uint8_t flag, uint8_t index, uint16_t* session,
                           uint16_t timeout)
 {
     bool ret = false;
@@ -1121,7 +1122,7 @@
             mdrv2->area =
                 std::make_unique<SharedMemoryArea>(xferAddress, xferLength);
         }
-        catch (const std::system_error &e)
+        catch (const std::system_error& e)
         {
             mdrv2->smbiosUnlock(idIndex);
             phosphor::logging::log<phosphor::logging::level::ERR>(
@@ -1225,7 +1226,7 @@
         sdbusplus::message::message reply = bus->call(method);
         reply.read(status);
     }
-    catch (sdbusplus::exception_t &e)
+    catch (sdbusplus::exception_t& e)
     {
         phosphor::logging::log<phosphor::logging::level::ERR>(
             "Error Sync data with service",
diff --git a/src/storagecommands.cpp b/src/storagecommands.cpp
index 9c73b6a..68e3c04 100644
--- a/src/storagecommands.cpp
+++ b/src/storagecommands.cpp
@@ -23,15 +23,16 @@
 #include <boost/algorithm/string.hpp>
 #include <boost/container/flat_map.hpp>
 #include <boost/process.hpp>
-#include <filesystem>
-#include <functional>
-#include <iostream>
 #include <ipmid/api.hpp>
 #include <ipmid/message.hpp>
 #include <phosphor-ipmi-host/selutility.hpp>
 #include <phosphor-logging/log.hpp>
 #include <sdbusplus/message/types.hpp>
 #include <sdbusplus/timer.hpp>
+
+#include <filesystem>
+#include <functional>
+#include <iostream>
 #include <stdexcept>
 #include <string_view>
 
diff --git a/src/whitelist-filter.cpp b/src/whitelist-filter.cpp
index 3f30a41..18ff4d5 100644
--- a/src/whitelist-filter.cpp
+++ b/src/whitelist-filter.cpp
@@ -1,5 +1,3 @@
-#include <algorithm>
-#include <array>
 #include <ipmi-whitelist.hpp>
 #include <ipmid/api.hpp>
 #include <ipmid/utils.hpp>
@@ -7,6 +5,9 @@
 #include <phosphor-logging/log.hpp>
 #include <xyz/openbmc_project/Control/Security/RestrictionMode/server.hpp>
 
+#include <algorithm>
+#include <array>
+
 using namespace phosphor::logging;
 using namespace sdbusplus::xyz::openbmc_project::Common::Error;
 using namespace sdbusplus::xyz::openbmc_project::Control::Security::server;
