diff --git a/command/channel_auth.cpp b/command/channel_auth.cpp
index 3308bf6..44d5cad 100644
--- a/command/channel_auth.cpp
+++ b/command/channel_auth.cpp
@@ -225,8 +225,8 @@
     static std::vector<uint8_t> supportedAlgorithms;
     static bool recordInit = false;
 
-    uint8_t rspChannel = ipmi::convertCurrentChannelNum(channelNumber,
-                                                        getInterfaceIndex());
+    uint8_t rspChannel =
+        ipmi::convertCurrentChannelNum(channelNumber, getInterfaceIndex());
 
     if (!ipmi::isValidChannel(rspChannel))
     {
@@ -253,8 +253,8 @@
         }
     }
 
-    const std::vector<uint8_t>& records = algoSelectBit ? cipherRecords
-                                                        : supportedAlgorithms;
+    const std::vector<uint8_t>& records =
+        algoSelectBit ? cipherRecords : supportedAlgorithms;
     static constexpr auto respSize = 16;
 
     // Session support is available in active LAN channels.
@@ -271,8 +271,8 @@
     // set of 16 and so on.
 
     // Calculate the number of record data bytes to be returned.
-    auto start = std::min(static_cast<size_t>(listIndex) * respSize,
-                          records.size());
+    auto start =
+        std::min(static_cast<size_t>(listIndex) * respSize, records.size());
     auto end = std::min((static_cast<size_t>(listIndex) * respSize) + respSize,
                         records.size());
     auto size = end - start;
diff --git a/command/guid.cpp b/command/guid.cpp
index a963f02..485d6b6 100644
--- a/command/guid.cpp
+++ b/command/guid.cpp
@@ -78,8 +78,8 @@
     ipmi::Value propValue;
     try
     {
-        const auto& [objPath, service] = ipmi::getDbusObject(bus, propInterface,
-                                                             subtreePath);
+        const auto& [objPath, service] =
+            ipmi::getDbusObject(bus, propInterface, subtreePath);
         // Read UUID property value from bmcObject
         // UUID is in RFC4122 format Ex: 61a39523-78f2-11e5-9862-e6402cfc3223
         propValue = ipmi::getDbusProperty(bus, service, objPath, propInterface,
@@ -120,28 +120,28 @@
             matchPtr = std::make_unique<sdbusplus::bus::match_t>(
                 bus, propertiesChangedNamespace(subtreePath, propInterface),
                 [](sdbusplus::message_t& m) {
-                try
-                {
-                    std::string iface{};
-                    std::map<std::string, ipmi::Value> pdict{};
-                    m.read(iface, pdict);
-                    if (iface != propInterface)
+                    try
                     {
-                        return;
+                        std::string iface{};
+                        std::map<std::string, ipmi::Value> pdict{};
+                        m.read(iface, pdict);
+                        if (iface != propInterface)
+                        {
+                            return;
+                        }
+                        auto guidStr = std::get<std::string>(pdict.at("UUID"));
+                        Guid tmpGuid{};
+                        rfcToGuid(guidStr, tmpGuid);
+                        guid = tmpGuid;
                     }
-                    auto guidStr = std::get<std::string>(pdict.at("UUID"));
-                    Guid tmpGuid{};
-                    rfcToGuid(guidStr, tmpGuid);
-                    guid = tmpGuid;
-                }
-                catch (const std::exception& e)
-                {
-                    // signal contained invalid guid; ignore it
-                    lg2::error(
-                        "Failed to parse propertiesChanged signal: {ERROR}",
-                        "ERROR", e);
-                }
-            });
+                    catch (const std::exception& e)
+                    {
+                        // signal contained invalid guid; ignore it
+                        lg2::error(
+                            "Failed to parse propertiesChanged signal: {ERROR}",
+                            "ERROR", e);
+                    }
+                });
         }
         catch (const std::exception& e)
         {
diff --git a/command/rakp12.cpp b/command/rakp12.cpp
index 2b7a925..7a5f198 100644
--- a/command/rakp12.cpp
+++ b/command/rakp12.cpp
@@ -29,9 +29,9 @@
                                  const std::optional<std::string>& messageArgs)
 {
     static constexpr std::string_view openBMCMessageRegistryVersion = "0.1.";
-    std::string messageID = "OpenBMC." +
-                            std::string(openBMCMessageRegistryVersion) +
-                            "InvalidLoginAttempted";
+    std::string messageID =
+        "OpenBMC." + std::string(openBMCMessageRegistryVersion) +
+        "InvalidLoginAttempted";
     lg2::error(
         "message: {MSG}, id: {REDFISH_MESSAGE_ID}, args: {REDFISH_MESSAGE_ARGS}",
         "MSG", journalMsg, "REDFISH_MESSAGE_ID", messageID,
@@ -75,8 +75,8 @@
         return outPayload;
     }
 
-    auto rakp1Size = sizeof(RAKP1request) -
-                     (userNameMaxLen - request->user_name_len);
+    auto rakp1Size =
+        sizeof(RAKP1request) - (userNameMaxLen - request->user_name_len);
 
     std::string message = "Invalid login attempted via RCMPP interface ";
     // Validate user name length in the message
@@ -154,8 +154,8 @@
     // be established with USER privilege as well as all other sessions are
     // initially set to USER privilege, regardless of the requested maximum
     // privilege.
-    if (!(static_cast<session::Privilege>(request->req_max_privilege_level &
-                                          session::reqMaxPrivMask) >
+    if (!(static_cast<session::Privilege>(
+              request->req_max_privilege_level & session::reqMaxPrivMask) >
           session::Privilege::CALLBACK))
     {
         response->rmcpStatusCode =
