diff --git a/ncsi_netlink_main.cpp b/ncsi_netlink_main.cpp
index 2441383..aa54956 100644
--- a/ncsi_netlink_main.cpp
+++ b/ncsi_netlink_main.cpp
@@ -14,9 +14,99 @@
  * limitations under the License.
  */
 
+#include "argument.hpp"
+#include "ncsi_util.hpp"
+
+#include <iostream>
+#include <string>
+
+static void exitWithError(const char* err, char** argv)
+{
+    phosphor::network::ncsi::ArgumentParser::usage(argv);
+    std::cerr << "ERROR: " << err << "\n";
+    exit(EXIT_FAILURE);
+}
+
 int main(int argc, char** argv)
 {
-    //TODO will implement later
+    using namespace phosphor::network;
+    using namespace phosphor::network::ncsi;
+    // Read arguments.
+    auto options = ArgumentParser(argc, argv);
+    int packageInt {};
+    int channelInt {};
+    int indexInt {};
+
+    // Parse out interface argument.
+    auto ifIndex = (options)["index"];
+    try
+    {
+        indexInt = stoi(ifIndex, nullptr);
+    }
+    catch (const std::exception& e)
+    {
+        exitWithError("Interface not specified.", argv);
+    }
+
+    if (indexInt < 0)
+    {
+        exitWithError("Interface value should be greater than equal to 0", argv);
+    }
+
+    // Parse out package argument.
+    auto package = (options)["package"];
+    try
+    {
+        packageInt = stoi(package, nullptr);
+    }
+    catch (const std::exception& e)
+    {
+         packageInt = DEFAULT_VALUE;
+    }
+
+    if (packageInt < 0)
+    {
+        packageInt = DEFAULT_VALUE;
+    }
+
+    // Parse out channel argument.
+    auto channel = (options)["channel"];
+    try
+    {
+        channelInt = stoi(channel, nullptr);
+    }
+    catch (const std::exception& e)
+    {
+         channelInt = DEFAULT_VALUE;
+    }
+
+    if (channelInt < 0)
+    {
+        channelInt = DEFAULT_VALUE;
+    }
+
+    auto setCmd = (options)["set"];
+    if (setCmd == "true")
+    {
+        // Can not perform set operation without pacakge.
+        if (packageInt == DEFAULT_VALUE)
+        {
+            exitWithError("Package not specified.", argv);
+        }
+        return ncsi::setChannel(indexInt, packageInt, channelInt);
+    }
+    else if ((options)["info"] == "true")
+    {
+        return ncsi::getInfo(indexInt, packageInt);
+    }
+    else if ((options)["clear"] == "true")
+    {
+        return  ncsi::clearInterface(indexInt);
+    }
+    else
+    {
+        exitWithError("No Command specified", argv);
+    }
     return 0;
 }
 
diff --git a/ncsi_util.cpp b/ncsi_util.cpp
index bf19ee3..77224f7 100644
--- a/ncsi_util.cpp
+++ b/ncsi_util.cpp
@@ -19,8 +19,6 @@
 using namespace phosphor::logging;
 using namespace sdbusplus::xyz::openbmc_project::Common::Error;
 
-constexpr auto DEFAULT_VALUE = -1;
-constexpr auto NONE = 0;
 using CallBack = int(*)(struct nl_msg* msg, void* arg);
 
 namespace internal
@@ -131,21 +129,20 @@
                 }
                 else
                 {
-                    log<level::DEBUG>("Channel not Active",
-                            entry("CHANNEL=%x", channel));
-
+                    log<level::DEBUG>("Channel Not Active",
+                                      entry("CHANNEL=%x", channel));
                 }
 
                 if (channeltb[NCSI_CHANNEL_ATTR_FORCED])
                 {
                     log<level::DEBUG>("Channel is forced");
                 }
-
             }
             else
             {
                 log<level::DEBUG>("Channel with no ID");
             }
+
             if (channeltb[NCSI_CHANNEL_ATTR_VERSION_MAJOR])
             {
                 auto major = nla_get_u32(channeltb[NCSI_CHANNEL_ATTR_VERSION_MAJOR]);
@@ -166,9 +163,10 @@
             }
             if (channeltb[NCSI_CHANNEL_ATTR_LINK_STATE])
             {
+
                 auto link = nla_get_u32(channeltb[NCSI_CHANNEL_ATTR_LINK_STATE]);
                 log<level::DEBUG>("Channel Link State",
-                                  entry("STATE=%d", link));
+                                  entry("STATE=%x", link));
             }
             if (channeltb[NCSI_CHANNEL_ATTR_VLAN_LIST])
             {
@@ -181,7 +179,6 @@
                     auto id = nla_get_u16(vid);
                     log<level::DEBUG>("VID",
                                       entry("VID=%d", id));
-
                     vid = nla_next(vid, &len);
                 }
             }
@@ -287,18 +284,27 @@
 
 int setChannel(int ifindex, int package, int channel)
 {
+    log<level::DEBUG>("Set Channel",
+                      entry("CHANNEL=%x", channel),
+                      entry("PACKAGE=%x", package),
+                      entry("IFINDEX=%x", ifindex));
     return internal::applyCmd(ifindex, ncsi_nl_commands::NCSI_CMD_SET_INTERFACE,
                               package, channel);
 }
 
 int clearInterface(int ifindex)
 {
+    log<level::DEBUG>("ClearInterface",
+                      entry("IFINDEX=%x", ifindex));
     return internal::applyCmd(ifindex,
                               ncsi_nl_commands::NCSI_CMD_CLEAR_INTERFACE);
 }
 
 int getInfo(int ifindex, int package)
 {
+    log<level::DEBUG>("Get Info",
+                      entry("PACKAGE=%x", package),
+                      entry("IFINDEX=%x", ifindex));
     if (package == DEFAULT_VALUE)
     {
         return internal::applyCmd(ifindex, ncsi_nl_commands::NCSI_CMD_PKG_INFO,
diff --git a/ncsi_util.hpp b/ncsi_util.hpp
index 570152b..db92269 100644
--- a/ncsi_util.hpp
+++ b/ncsi_util.hpp
@@ -5,6 +5,9 @@
 namespace ncsi
 {
 
+constexpr auto DEFAULT_VALUE = -1;
+constexpr auto NONE = 0;
+
 /* @brief  This function will ask underlying NCSI driver
  *         to set a specific  package or package/channel
  *         combination as the preferred choice.
