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
