diff --git a/src/ncsi_util.hpp b/src/ncsi_util.hpp
index a04e249..aa2051c 100644
--- a/src/ncsi_util.hpp
+++ b/src/ncsi_util.hpp
@@ -15,74 +15,67 @@
 
 struct Interface
 {
+    /* @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] 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 package, int channel, int opcode,
+                       std::span<const unsigned char> payload);
+
+    /* @brief  This function will ask underlying NCSI driver
+     *         to set a specific  package or package/channel
+     *         combination as the preferred choice.
+     *         This function talks with the NCSI driver over
+     *         netlink messages.
+     * @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 package, int channel);
+
+    /* @brief  This function will ask underlying NCSI driver
+     *         to clear any preferred setting from the interface.
+     *         This function talks with the NCSI driver over
+     *         netlink messages.
+     * @returns 0 on success and negative value for failure.
+     */
+    int clearInterface();
+
+    /* @brief  This function is used to dump all the info
+     *         of the package and the channels underlying
+     *         the package.
+     * @param[in] package - NCSI Package.
+     * @returns 0 on success and negative value for failure.
+     */
+    int getInfo(int package);
+
+    /* @brief  This function assigns a mask controlling responses to AEN from a
+     * package.
+     * @param[in] mask - A 32-bit mask integer
+     * @returns 0 on success and negative value for failure.
+     */
+    int setPackageMask(unsigned int mask);
+
+    /* @brief  This function sets the AEN mask for the channels inside the
+     * selected package.
+     * @param[in] package - NCSI Package.
+     * @param[in] mask - A 32-bit mask integer
+     * @returns 0 on success and negative value for failure.
+     */
+    int setChannelMask(int package, unsigned int mask);
+
     int ifindex;
 };
 
 std::string to_string(Interface& interface);
 
-/* @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] 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(Interface& interface, int package, int channel, int opcode,
-                   std::span<const unsigned char> payload);
-
-/* @brief  This function will ask underlying NCSI driver
- *         to set a specific  package or package/channel
- *         combination as the preferred choice.
- *         This function talks with the NCSI driver over
- *         netlink messages.
- * @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(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] interface - Interface
- * @returns 0 on success and negative value for failure.
- */
-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] interface - Interface
- * @param[in] package - NCSI Package.
- * @returns 0 on success and negative value for failure.
- */
-int getInfo(Interface& interface, int package);
-
-/* @brief  This function assigns a mask controlling responses to AEN from a
- * package.
- * @param[in] ifindex - Interface Index.
- * @param[in] mask - A 32-bit mask integer
- * @returns 0 on success and negative value for failure.
- */
-int setPackageMask(Interface& interface, unsigned int mask);
-
-/* @brief  This function sets the AEN mask for the channels inside the selected
- * package.
- * @param[in] ifindex - Interface Index.
- * @param[in] package - NCSI Package.
- * @param[in] mask - A 32-bit mask integer
- * @returns 0 on success and negative value for failure.
- */
-int setChannelMask(Interface& interface, int package, unsigned int mask);
-
 } // namespace ncsi
 } // namespace network
 } // namespace phosphor
