diff options
-rw-r--r-- | Makefile.am | 6 | ||||
-rw-r--r-- | ethernet_interface.cpp | 8 | ||||
-rw-r--r-- | ethernet_interface.hpp | 7 | ||||
-rw-r--r-- | test/Makefile.am | 1 | ||||
-rw-r--r-- | vlan_interface.cpp | 68 | ||||
-rw-r--r-- | vlan_interface.hpp | 71 |
6 files changed, 155 insertions, 6 deletions
diff --git a/Makefile.am b/Makefile.am index 4c7ab37..8135e16 100644 --- a/Makefile.am +++ b/Makefile.am @@ -20,7 +20,8 @@ noinst_HEADERS = \ routing_table.hpp \ config_parser.hpp \ system_configuration.hpp \ - dhcp_configuration.hpp + dhcp_configuration.hpp \ + vlan_interface.hpp phosphor_network_manager_SOURCES = \ ethernet_interface.cpp \ @@ -34,7 +35,8 @@ phosphor_network_manager_SOURCES = \ util.cpp \ routing_table.cpp \ config_parser.cpp \ - dhcp_configuration.cpp + dhcp_configuration.cpp \ + vlan_interface.cpp CLEANFILES = \ xyz/openbmc_project/Network/VLAN/Create/server.cpp \ diff --git a/ethernet_interface.cpp b/ethernet_interface.cpp index 14ccc6c..d7648a2 100644 --- a/ethernet_interface.cpp +++ b/ethernet_interface.cpp @@ -33,7 +33,8 @@ constexpr size_t SIZE_BUFF = 512; EthernetInterface::EthernetInterface(sdbusplus::bus::bus& bus, const std::string& objPath, bool dhcpEnabled, - Manager& parent) : + Manager& parent, + bool emitSignal) : Ifaces(bus, objPath.c_str(), true), bus(bus), manager(parent), @@ -45,7 +46,10 @@ EthernetInterface::EthernetInterface(sdbusplus::bus::bus& bus, mACAddress(getMACAddress()); createIPAddressObjects(); // Emit deferred signal. - this->emit_object_added(); + if (emitSignal) + { + this->emit_object_added(); + } } void EthernetInterface::createIPAddressObjects() diff --git a/ethernet_interface.hpp b/ethernet_interface.hpp index 88200f8..88cbf1e 100644 --- a/ethernet_interface.hpp +++ b/ethernet_interface.hpp @@ -59,11 +59,14 @@ class EthernetInterface : public Ifaces * @param[in] objPath - Path to attach at. * @param[in] dhcpEnabled - is dhcp enabled(true/false). * @param[in] parent - parent object. + * @param[in] emitSignal - true if the object added signal needs to be + * send. */ EthernetInterface(sdbusplus::bus::bus& bus, const std::string& objPath, bool dhcpEnabled, - Manager& parent); + Manager& parent, + bool emitSignal = true); /** @brief Function to create ipaddress dbus object. * @param[in] addressType - Type of ip address. @@ -98,7 +101,7 @@ class EthernetInterface : public Ifaces using EthernetInterfaceIntf::dHCPEnabled; - private: + protected: /** @brief get the info of the ethernet interface. * @return tuple having the link speed,autonegotiation,duplexmode . diff --git a/test/Makefile.am b/test/Makefile.am index 5903ee0..35f49db 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -35,5 +35,6 @@ test_LDADD = $(top_builddir)/ethernet_interface.o \ $(top_builddir)/system_configuration.o \ $(top_builddir)/dhcp_configuration.o \ $(top_builddir)/config_parser.o \ + $(top_builddir)/vlan_interface.o \ $(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 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 diff --git a/vlan_interface.hpp b/vlan_interface.hpp new file mode 100644 index 0000000..7f8d043 --- /dev/null +++ b/vlan_interface.hpp @@ -0,0 +1,71 @@ +#pragma once + +#include "types.hpp" + +#include "xyz/openbmc_project/Object/Delete/server.hpp" +#include "xyz/openbmc_project/Network/VLAN/server.hpp" + +#include <sdbusplus/bus.hpp> +#include <sdbusplus/server/object.hpp> + +#include <string> +#include "ethernet_interface.hpp" + +namespace phosphor +{ +namespace network +{ + +class EthernetInterface; +class Manager; + + +using VlanIface = sdbusplus::xyz::openbmc_project::Network::server::VLAN; +using VlanIntfObject = sdbusplus::server::object::object<VlanIface>; + +/** @class VlanInterface + * @brief OpenBMC vlan Interface implementation. + * @details A concrete implementation for the vlan interface + */ +class VlanInterface : public VlanIntfObject, public EthernetInterface +{ + public: + VlanInterface() = delete; + VlanInterface(const VlanInterface&) = delete; + VlanInterface& operator=(const VlanInterface&) = delete; + VlanInterface(VlanInterface&&) = delete; + VlanInterface& operator=(VlanInterface&&) = delete; + virtual ~VlanInterface() = default; + + /** @brief Constructor to put object onto bus at a dbus path. + * @param[in] bus - Bus to attach to. + * @param[in] objPath - Path to attach at. + * @param[in] dhcpEnabled - DHCP enable value. + * @param[in] vlanID - vlan identifier. + * @param[in] intf - ethernet interface object. + * @param[in] manager - network manager object. + */ + VlanInterface(sdbusplus::bus::bus& bus, + const std::string& objPath, + bool dhcpEnabled, + uint32_t vlanID, + EthernetInterface& intf, + Manager& manager); + + /** @brief writes the device configuration. + systemd reads this configuration file + and creates the vlan interface.*/ + void writeDeviceFile(); + + private: + + /** @brief VLAN Identifier. */ + using VlanIface::id; + + EthernetInterface& parentInterface; + + friend class TestVlanInterface; +}; + +} // namespace network +} // namespace phosphor |