Create the system conf Dbus Object

Also put extra checks while writing the gateway
and the destination to the conf file.

Change-Id: I8f24b3f293e6f978b655f061a198a32690dd44f3
Signed-off-by: Ratan Gupta <ratagupt@in.ibm.com>
diff --git a/network_manager.cpp b/network_manager.cpp
index a635952..aff86a0 100644
--- a/network_manager.cpp
+++ b/network_manager.cpp
@@ -8,7 +8,6 @@
 
 #include <algorithm>
 #include <bitset>
-#include <experimental/filesystem>
 #include <map>
 #include <fstream>
 
@@ -24,17 +23,25 @@
 {
 
 using namespace phosphor::logging;
-namespace fs = std::experimental::filesystem;
+using namespace sdbusplus::xyz::openbmc_project::Common::Error;
 
 Manager::Manager(sdbusplus::bus::bus& bus, const char* objPath):
     details::VLANCreateIface(bus, objPath, true),
     bus(bus),
     objectPath(objPath)
 {
+    confDir = NETWORK_CONF_DIR;
+}
+
+void Manager::setConfDir(const fs::path& dir)
+{
+    confDir = dir;
 }
 
 void Manager::createInterfaces()
 {
+    //clear all the interfaces first
+    interfaces.clear();
 
     auto interfaceInfoList = getInterfaceAddrs();
 
@@ -56,6 +63,18 @@
     }
 }
 
+void Manager::createChildObjects()
+{
+    // creates the ethernet interface dbus object.
+    createInterfaces();
+    // create the system conf object.
+    fs::path objPath = objectPath;
+    objPath /= "config";
+    systemConf = std::make_unique<phosphor::network::SystemConfiguration>(
+                        bus, objPath.string(), *this);
+
+}
+
 void Manager::vLAN(IntfName interfaceName, uint16_t id)
 {
 }
@@ -216,7 +235,7 @@
     for (const auto& intf : interfaces)
     {
 
-        fs::path confPath {NETWORK_CONF_DIR};
+        fs::path confPath = confDir;
         std::string fileName = "00-bmc-"s + intf.first + ".network"s;
         confPath /= fileName;
         std::fstream stream;
@@ -238,12 +257,16 @@
                                           addr.second->prefixLength());
 
                 stream << "Address=" << address << "\n";
-                stream << "Gateway=" << addr.second->gateway() << "\n";
+                if (addr.second->gateway() != "0.0.0.0" &&
+                    addr.second->gateway() != "")
+                {
+                    stream << "Gateway=" << addr.second->gateway() << "\n";
+                }
 
             }
         }
-
-        stream << "Gateway=" << this->defaultGateway << "\n";
+        stream << "Gateway=" << systemConf->defaultGateway() << "\n";
+        // write the route section
         stream << "[" << "Route" << "]\n";
         for(const auto& addr : addrs)
         {
@@ -255,8 +278,10 @@
                                             addr.second->address(),
                                             addr.second->prefixLength());
 
-                if (addr.second->gateway() != "0.0.0.0" ||
-                    addr.second->gateway() != "")
+                if (addr.second->gateway() != "0.0.0.0" &&
+                    addr.second->gateway() != "" &&
+                    destination != "0.0.0.0" &&
+                    destination != "")
                 {
 
                     stream << "Gateway=" << addr.second->gateway() << "\n";
diff --git a/network_manager.hpp b/network_manager.hpp
index b19ec72..2d4afe7 100644
--- a/network_manager.hpp
+++ b/network_manager.hpp
@@ -1,6 +1,7 @@
 #pragma once
 
 #include "ethernet_interface.hpp"
+#include "system_configuration.hpp"
 #include "types.hpp"
 #include "xyz/openbmc_project/Network/VLAN/Create/server.hpp"
 #include <xyz/openbmc_project/Common/FactoryReset/server.hpp>
@@ -12,12 +13,14 @@
 #include <memory>
 #include <string>
 #include <vector>
+#include <experimental/filesystem>
 
 namespace phosphor
 {
 namespace network
 {
 
+namespace fs = std::experimental::filesystem;
 namespace details
 {
 
@@ -86,11 +89,15 @@
          */
         void createInterfaces();
 
-        /** TODO: would remove it once we implement the system
-         *  conf dbus object.
-         *  openbmc/openbmc#1295
+        /** @brief create child interface object and the system conf object.
          */
-        std::string defaultGateway; // default gateway
+        void createChildObjects();
+
+        /** @brief sets the network conf directory.
+         *  @param[in] dirName - Absolute path of the directory.
+         */
+        void setConfDir(const fs::path& dir);
+
     private:
         /** @brief Get all the interfaces from the system.
          *  @returns list of interface names.
@@ -113,6 +120,12 @@
         /** @brief Path of Object. */
         std::string objectPath;
 
+        /** @brief pointer to system conf object. */
+        std::unique_ptr<SystemConfiguration> systemConf = nullptr;
+
+        /** @brief Network Configuration directory. */
+        fs::path confDir;
+
         friend class TestNetworkManager;
 
 };
diff --git a/network_manager_main.cpp b/network_manager_main.cpp
index a53d32c..d98ab0d 100644
--- a/network_manager_main.cpp
+++ b/network_manager_main.cpp
@@ -12,7 +12,7 @@
 
     phosphor::network::Manager manager(bus, OBJ_NETWORK);
 
-    manager.createInterfaces();
+    manager.createChildObjects();
 
     bus.request_name(BUSNAME_NETWORK);
 
diff --git a/test/Makefile.am b/test/Makefile.am
index 9736ccd..8f951bf 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -31,5 +31,6 @@
 			$(top_builddir)/ipaddress.cpp \
 			$(top_builddir)/routing_table.cpp \
 			$(top_builddir)/util.cpp \
+			$(top_builddir)/system_configuration.cpp \
 			$(top_builddir)/xyz/openbmc_project/Network/VLAN/Create/phosphor_network_manager-server.o \
 			$(top_builddir)/xyz/openbmc_project/Network/IP/Create/phosphor_network_manager-server.o