Implement the Vlan Interface

Change-Id: I6085868ba4e30bb9e1c6f6d9895a40ebff82804f
Signed-off-by: Ratan Gupta <ratagupt@in.ibm.com>
diff --git a/vlan_interface.cpp b/vlan_interface.cpp
new file mode 100644
index 0000000..f4224d4
--- /dev/null
+++ b/vlan_interface.cpp
@@ -0,0 +1,68 @@
+#include "config.h"
+#include "ethernet_interface.hpp"
+#include "vlan_interface.hpp"
+#include "network_manager.hpp"
+
+#include <phosphor-logging/log.hpp>
+#include "xyz/openbmc_project/Common/error.hpp"
+#include <phosphor-logging/elog-errors.hpp>
+
+#include <string>
+#include <algorithm>
+#include <fstream>
+#include <experimental/filesystem>
+
+namespace phosphor
+{
+namespace network
+{
+
+using namespace phosphor::logging;
+using namespace sdbusplus::xyz::openbmc_project::Common::Error;
+
+VlanInterface::VlanInterface(sdbusplus::bus::bus& bus,
+                             const std::string& objPath,
+                             bool dhcpEnabled,
+                             uint32_t vlanID,
+                             EthernetInterface& intf,
+                             Manager& parent ) :
+        VlanIntfObject(bus, objPath.c_str(), true),
+        EthernetInterface(bus, objPath, dhcpEnabled, parent, false),
+        parentInterface(intf)
+{
+    id(vlanID);
+    VlanIface::interfaceName(EthernetInterface::interfaceName());
+
+    VlanIntfObject::emit_object_added();
+}
+
+void VlanInterface::writeDeviceFile()
+{
+    using namespace std::string_literals;
+    fs::path confPath = manager.getConfDir();
+    std::string fileName = EthernetInterface::interfaceName() + ".netdev"s;
+    confPath /= fileName;
+    std::fstream stream;
+    try
+    {
+        stream.open(confPath.c_str(), std::fstream::out);
+    }
+    catch (std::ios_base::failure& e)
+    {
+        log<level::ERR>("Unable to open the VLAN device file",
+                         entry("FILE=%s", confPath.c_str()),
+                         entry("ERROR=%s", e.what()));
+        elog<InternalFailure>();
+
+    }
+
+    stream << "[" << "NetDev" << "]\n";
+    stream << "Name=" << EthernetInterface::interfaceName() << "\n";
+    stream << "Kind=vlan" << "\n";
+    stream << "[VLAN]" << "\n";
+    stream << "Id=" << id() << "\n";
+    stream.close();
+}
+
+}//namespace network
+}//namespace phosphor