diff --git a/transportconstants.hpp b/transportconstants.hpp
index 3f865c6..69456bc 100644
--- a/transportconstants.hpp
+++ b/transportconstants.hpp
@@ -114,11 +114,6 @@
 constexpr uint8_t Dynamic = 1;
 }; // namespace IPv6RouterControlFlag
 
-// LAN Handler specific response codes
-constexpr Cc ccParamNotSupported = 0x80;
-constexpr Cc ccParamSetLocked = 0x81;
-constexpr Cc ccParamReadOnly = 0x82;
-
 // VLANs are a 12-bit value
 constexpr uint16_t VLAN_VALUE_MASK = 0x0fff;
 constexpr uint16_t VLAN_ENABLE_FLAG = 0x8000;
@@ -153,8 +148,5 @@
     Port,           //!< SOL payload port.
 };
 
-constexpr uint8_t ipmiCCParamNotSupported = 0x80;
-constexpr uint8_t ipmiCCWriteReadParameter = 0x82;
-
 } // namespace transport
 } // namespace ipmi
diff --git a/transporthandler.cpp b/transporthandler.cpp
index 6735ee6..df4e396 100644
--- a/transporthandler.cpp
+++ b/transporthandler.cpp
@@ -53,6 +53,32 @@
 namespace transport
 {
 
+// LAN Handler specific response codes
+constexpr Cc ccParamNotSupported = 0x80;
+constexpr Cc ccParamSetLocked = 0x81;
+constexpr Cc ccParamReadOnly = 0x82;
+constexpr Cc ccWriteReadParameter = 0x82;
+
+static inline auto responseParamNotSupported()
+{
+    return response(ccParamNotSupported);
+}
+
+static inline auto responseParamSetLocked()
+{
+    return response(ccParamSetLocked);
+}
+
+static inline auto responseParamReadOnly()
+{
+    return response(ccParamReadOnly);
+}
+
+static inline auto responseWriteReadParameter()
+{
+    return response(ccWriteReadParameter);
+}
+
 /** @brief Valid address origins for IPv4 */
 const std::unordered_set<IP::AddressOrigin> originsV4 = {
     IP::AddressOrigin::Static,
@@ -696,12 +722,12 @@
 RspType<> setLanOem(uint8_t, uint8_t, message::Payload& req)
 {
     req.trailingOk = true;
-    return response(ccParamNotSupported);
+    return responseParamNotSupported();
 }
 
 RspType<message::Payload> getLanOem(uint8_t, uint8_t, uint8_t, uint8_t)
 {
-    return response(ccParamNotSupported);
+    return responseParamNotSupported();
 }
 
 /**
@@ -772,7 +798,7 @@
                     auto& storedStatus = getSetStatus(channel);
                     if (storedStatus == SetStatus::InProgress)
                     {
-                        return response(ccParamSetLocked);
+                        return responseParamSetLocked();
                     }
                     storedStatus = status;
                     return responseSuccess();
@@ -784,17 +810,17 @@
                     }
                     return responseSuccess();
             }
-            return response(ccParamNotSupported);
+            return responseParamNotSupported();
         }
         case LanParam::AuthSupport:
         {
             req.trailingOk = true;
-            return response(ccParamReadOnly);
+            return responseParamReadOnly();
         }
         case LanParam::AuthEnables:
         {
             req.trailingOk = true;
-            return response(ccParamReadOnly);
+            return responseParamReadOnly();
         }
         case LanParam::IP:
         {
@@ -837,7 +863,7 @@
                 case IPSrc::BMC:
                     return responseInvalidFieldRequest();
             }
-            return response(ccParamNotSupported);
+            return responseParamNotSupported();
         }
         case LanParam::MAC:
         {
@@ -912,7 +938,7 @@
         case LanParam::IPFamilySupport:
         {
             req.trailingOk = true;
-            return response(ccParamReadOnly);
+            return responseParamReadOnly();
         }
         case LanParam::IPFamilyEnables:
         {
@@ -928,14 +954,14 @@
                     return responseSuccess();
                 case IPFamilyEnables::IPv4Only:
                 case IPFamilyEnables::IPv6Only:
-                    return response(ccParamNotSupported);
+                    return responseParamNotSupported();
             }
-            return response(ccParamNotSupported);
+            return responseParamNotSupported();
         }
         case LanParam::IPv6Status:
         {
             req.trailingOk = true;
-            return response(ccParamReadOnly);
+            return responseParamReadOnly();
         }
         case LanParam::IPv6StaticAddresses:
         {
@@ -976,7 +1002,7 @@
         case LanParam::IPv6DynamicAddresses:
         {
             req.trailingOk = true;
-            return response(ccParamReadOnly);
+            return responseParamReadOnly();
         }
         case LanParam::IPv6RouterControl:
         {
@@ -991,7 +1017,7 @@
                     control & std::bitset<8>(reservedRACCBits));
                 expected.any())
             {
-                return response(ccParamNotSupported);
+                return responseParamNotSupported();
             }
 
             bool enableRA = control[IPv6RouterControlFlag::Dynamic];
@@ -1071,7 +1097,7 @@
     }
 
     req.trailingOk = true;
-    return response(ccParamNotSupported);
+    return responseParamNotSupported();
 }
 
 RspType<> setLan(Context::ptr ctx, uint4_t channelBits, uint4_t reserved1,
@@ -1373,7 +1399,7 @@
         return getLanOem(channel, parameter, set, block);
     }
 
-    return response(ccParamNotSupported);
+    return responseParamNotSupported();
 }
 
 constexpr const char* solInterface = "xyz.openbmc_project.Ipmi.SOL";
@@ -1538,13 +1564,13 @@
         }
         case SolConfParam::Port:
         {
-            return response(ipmiCCWriteReadParameter);
+            return responseWriteReadParameter();
         }
         case SolConfParam::NonVbitrate:
         case SolConfParam::Vbitrate:
         case SolConfParam::Channel:
         default:
-            return response(ipmiCCParamNotSupported);
+            return responseParamNotSupported();
     }
     return responseSuccess();
 }
@@ -1695,7 +1721,7 @@
                     "/xyz/openbmc_project/console/default",
                     "xyz.openbmc_project.Console.UART", "Baud", baudRate))
             {
-                return response(ccParamNotSupported);
+                return responseParamNotSupported();
             }
             switch (baudRate)
             {
@@ -1722,10 +1748,10 @@
         }
         case SolConfParam::Vbitrate:
         default:
-            return response(ipmiCCParamNotSupported);
+            return responseParamNotSupported();
     }
 
-    return response(ccParamNotSupported);
+    return responseParamNotSupported();
 }
 
 } // namespace transport
