diff --git a/src/ncsi_netlink_main.cpp b/src/ncsi_netlink_main.cpp
index 6657c60..3ac42bd 100644
--- a/src/ncsi_netlink_main.cpp
+++ b/src/ncsi_netlink_main.cpp
@@ -56,6 +56,8 @@
                       argv);
     }
 
+    Interface interface{indexInt};
+
     // Parse out package argument.
     auto package = (options)["package"];
     try
@@ -137,7 +139,7 @@
         }
 
         return ncsi::sendOemCommand(
-            indexInt, packageInt, channelInt, operationInt,
+            interface, packageInt, channelInt, operationInt,
             std::span<const unsigned char>(payload.begin(), payload.end()));
     }
     else if ((options)["set"] == "true")
@@ -147,15 +149,15 @@
         {
             exitWithError("Package not specified.", argv);
         }
-        return ncsi::setChannel(indexInt, packageInt, channelInt);
+        return ncsi::setChannel(interface, packageInt, channelInt);
     }
     else if ((options)["info"] == "true")
     {
-        return ncsi::getInfo(indexInt, packageInt);
+        return ncsi::getInfo(interface, packageInt);
     }
     else if ((options)["clear"] == "true")
     {
-        return ncsi::clearInterface(indexInt);
+        return ncsi::clearInterface(interface);
     }
     else if (!(options)["pmask"].empty())
     {
@@ -173,7 +175,7 @@
         {
             exitWithError("Package mask value is not valid", argv);
         }
-        return ncsi::setPackageMask(indexInt, mask);
+        return ncsi::setPackageMask(interface, mask);
     }
     else if (!(options)["cmask"].empty())
     {
@@ -195,7 +197,7 @@
         {
             exitWithError("Channel mask value is not valid", argv);
         }
-        return ncsi::setChannelMask(indexInt, packageInt, mask);
+        return ncsi::setChannelMask(interface, packageInt, mask);
     }
     else
     {
diff --git a/src/ncsi_util.cpp b/src/ncsi_util.cpp
index 688e8b8..8539b5c 100644
--- a/src/ncsi_util.cpp
+++ b/src/ncsi_util.cpp
@@ -265,9 +265,9 @@
     return 0;
 };
 
-int applyCmd(int ifindex, const Command& cmd, int package = DEFAULT_VALUE,
-             int channel = DEFAULT_VALUE, int flags = NONE,
-             CallBack function = nullptr)
+int applyCmd(Interface& interface, const Command& cmd,
+             int package = DEFAULT_VALUE, int channel = DEFAULT_VALUE,
+             int flags = NONE, CallBack function = nullptr)
 {
     int cb_ret = 0;
     nlSocketPtr socket(nl_socket_alloc(), &::nl_socket_free);
@@ -333,12 +333,13 @@
         }
     }
 
-    ret = nla_put_u32(msg.get(), ncsi_nl_attrs::NCSI_ATTR_IFINDEX, ifindex);
+    ret = nla_put_u32(msg.get(), ncsi_nl_attrs::NCSI_ATTR_IFINDEX,
+                      interface.ifindex);
     if (ret < 0)
     {
         lg2::error("Failed to set the attribute , RC : {RC} INTERFACE : "
                    "{INTERFACE}",
-                   "RC", ret, "INTERFACE", lg2::hex, ifindex);
+                   "RC", ret, "INTERFACE", lg2::hex, interface.ifindex);
         return ret;
     }
 
@@ -419,88 +420,91 @@
 
 } // namespace internal
 
-int sendOemCommand(int ifindex, int package, int channel, int operation,
-                   std::span<const unsigned char> payload)
+int sendOemCommand(Interface& interface, int package, int channel,
+                   int operation, std::span<const unsigned char> payload)
 {
     lg2::debug("Send OEM Command, CHANNEL : {CHANNEL} , PACKAGE : {PACKAGE}, "
                "INTERFACE_INDEX: {INTERFACE_INDEX}",
                "CHANNEL", lg2::hex, channel, "PACKAGE", lg2::hex, package,
-               "INTERFACE_INDEX", lg2::hex, ifindex);
+               "INTERFACE_INDEX", lg2::hex, interface.ifindex);
     if (!payload.empty())
     {
         lg2::debug("Payload: {PAYLOAD}", "PAYLOAD", toHexStr(payload));
     }
 
     return internal::applyCmd(
-        ifindex,
+        interface,
         internal::Command(ncsi_nl_commands::NCSI_CMD_SEND_CMD, operation,
                           payload),
         package, channel, NONE, internal::sendCallBack);
 }
 
-int setChannel(int ifindex, int package, int channel)
+int setChannel(Interface& interface, int package, int channel)
 {
     lg2::debug(
         "Set CHANNEL : {CHANNEL} , PACKAGE : {PACKAGE}, INTERFACE_INDEX: "
         "{INTERFACE_INDEX}",
         "CHANNEL", lg2::hex, channel, "PACKAGE", lg2::hex, package,
-        "INTERFACE_INDEX", lg2::hex, ifindex);
+        "INTERFACE_INDEX", lg2::hex, interface.ifindex);
     return internal::applyCmd(
-        ifindex, internal::Command(ncsi_nl_commands::NCSI_CMD_SET_INTERFACE),
+        interface, internal::Command(ncsi_nl_commands::NCSI_CMD_SET_INTERFACE),
         package, channel);
 }
 
-int clearInterface(int ifindex)
+int clearInterface(Interface& interface)
 {
     lg2::debug("ClearInterface , INTERFACE_INDEX : {INTERFACE_INDEX}",
-               "INTERFACE_INDEX", lg2::hex, ifindex);
+               "INTERFACE_INDEX", lg2::hex, interface.ifindex);
     return internal::applyCmd(
-        ifindex, internal::Command(ncsi_nl_commands::NCSI_CMD_CLEAR_INTERFACE));
+        interface,
+        internal::Command(ncsi_nl_commands::NCSI_CMD_CLEAR_INTERFACE));
 }
 
-int getInfo(int ifindex, int package)
+int getInfo(Interface& interface, int package)
 {
     lg2::debug(
         "Get Info , PACKAGE : {PACKAGE}, INTERFACE_INDEX: {INTERFACE_INDEX}",
-        "PACKAGE", lg2::hex, package, "INTERFACE_INDEX", lg2::hex, ifindex);
+        "PACKAGE", lg2::hex, package, "INTERFACE_INDEX", lg2::hex,
+        interface.ifindex);
     if (package == DEFAULT_VALUE)
     {
         return internal::applyCmd(
-            ifindex, internal::Command(ncsi_nl_commands::NCSI_CMD_PKG_INFO),
+            interface, internal::Command(ncsi_nl_commands::NCSI_CMD_PKG_INFO),
             package, DEFAULT_VALUE, NLM_F_DUMP, internal::infoCallBack);
     }
     else
     {
-        return internal::applyCmd(ifindex, ncsi_nl_commands::NCSI_CMD_PKG_INFO,
-                                  package, DEFAULT_VALUE, NONE,
-                                  internal::infoCallBack);
+        return internal::applyCmd(interface,
+                                  ncsi_nl_commands::NCSI_CMD_PKG_INFO, package,
+                                  DEFAULT_VALUE, NONE, internal::infoCallBack);
     }
 }
 
-int setPackageMask(int ifindex, unsigned int mask)
+int setPackageMask(Interface& interface, unsigned int mask)
 {
     lg2::debug(
         "Set Package Mask , INTERFACE_INDEX: {INTERFACE_INDEX} MASK: {MASK}",
-        "INTERFACE_INDEX", lg2::hex, ifindex, "MASK", lg2::hex, mask);
+        "INTERFACE_INDEX", lg2::hex, interface.ifindex, "MASK", lg2::hex, mask);
     auto payload = std::span<const unsigned char>(
         reinterpret_cast<const unsigned char*>(&mask),
         reinterpret_cast<const unsigned char*>(&mask) + sizeof(decltype(mask)));
     return internal::applyCmd(
-        ifindex, internal::Command(ncsi_nl_commands::NCSI_CMD_SET_PACKAGE_MASK,
-                                   0, payload));
+        interface,
+        internal::Command(ncsi_nl_commands::NCSI_CMD_SET_PACKAGE_MASK, 0,
+                          payload));
 }
 
-int setChannelMask(int ifindex, int package, unsigned int mask)
+int setChannelMask(Interface& interface, int package, unsigned int mask)
 {
     lg2::debug(
         "Set Channel Mask , INTERFACE_INDEX: {INTERFACE_INDEX}, PACKAGE : {PACKAGE} MASK: {MASK}",
-        "INTERFACE_INDEX", lg2::hex, ifindex, "PACKAGE", lg2::hex, package,
-        "MASK", lg2::hex, mask);
+        "INTERFACE_INDEX", lg2::hex, interface.ifindex, "PACKAGE", lg2::hex,
+        package, "MASK", lg2::hex, mask);
     auto payload = std::span<const unsigned char>(
         reinterpret_cast<const unsigned char*>(&mask),
         reinterpret_cast<const unsigned char*>(&mask) + sizeof(decltype(mask)));
     return internal::applyCmd(
-        ifindex,
+        interface,
         internal::Command(ncsi_nl_commands::NCSI_CMD_SET_CHANNEL_MASK, 0,
                           payload),
         package);
diff --git a/src/ncsi_util.hpp b/src/ncsi_util.hpp
index dfa39e5..da45a38 100644
--- a/src/ncsi_util.hpp
+++ b/src/ncsi_util.hpp
@@ -12,19 +12,24 @@
 constexpr auto DEFAULT_VALUE = -1;
 constexpr auto NONE = 0;
 
+struct Interface
+{
+    int ifindex;
+};
+
 /* @brief  This function will ask underlying NCSI driver
  *         to send an OEM command (command type 0x50) with
  *         the specified payload as the OEM data.
  *         This function talks with the NCSI driver over
  *         netlink messages.
- * @param[in] ifindex - Interface Index.
+ * @param[in] interface - Interface
  * @param[in] package - NCSI Package.
  * @param[in] channel - Channel number with in the package.
  * @param[in] opcode  - NCSI Send Command sub-operation
  * @param[in] payload - OEM data to send.
  * @returns 0 on success and negative value for failure.
  */
-int sendOemCommand(int ifindex, int package, int channel, int opcode,
+int sendOemCommand(Interface& interface, int package, int channel, int opcode,
                    std::span<const unsigned char> payload);
 
 /* @brief  This function will ask underlying NCSI driver
@@ -32,31 +37,31 @@
  *         combination as the preferred choice.
  *         This function talks with the NCSI driver over
  *         netlink messages.
- * @param[in] ifindex - Interface Index.
+ * @param[in] interface - Interface
  * @param[in] package - NCSI Package.
  * @param[in] channel - Channel number with in the package.
  * @returns 0 on success and negative value for failure.
  */
-int setChannel(int ifindex, int package, int channel);
+int setChannel(Interface& interface, int package, int channel);
 
 /* @brief  This function will ask underlying NCSI driver
  *         to clear any preferred setting from the given
  *         interface.
  *         This function talks with the NCSI driver over
  *         netlink messages.
- * @param[in] ifindex - Interface Index.
+ * @param[in] interface - Interface
  * @returns 0 on success and negative value for failure.
  */
-int clearInterface(int ifindex);
+int clearInterface(Interface& interface);
 
 /* @brief  This function is used to dump all the info
  *         of the package and the channels underlying
  *         the package.
- * @param[in] ifindex - Interface Index.
+ * @param[in] interface - Interface
  * @param[in] package - NCSI Package.
  * @returns 0 on success and negative value for failure.
  */
-int getInfo(int ifindex, int package);
+int getInfo(Interface& interface, int package);
 
 /* @brief  This function assigns a mask controlling responses to AEN from a
  * package.
@@ -64,7 +69,7 @@
  * @param[in] mask - A 32-bit mask integer
  * @returns 0 on success and negative value for failure.
  */
-int setPackageMask(int ifindex, unsigned int mask);
+int setPackageMask(Interface& interface, unsigned int mask);
 
 /* @brief  This function sets the AEN mask for the channels inside the selected
  * package.
@@ -73,7 +78,7 @@
  * @param[in] mask - A 32-bit mask integer
  * @returns 0 on success and negative value for failure.
  */
-int setChannelMask(int ifindex, int package, unsigned int mask);
+int setChannelMask(Interface& interface, int package, unsigned int mask);
 
 } // namespace ncsi
 } // namespace network
