diff options
author | Ratan Gupta <ratagupt@in.ibm.com> | 2017-07-25 13:47:13 +0530 |
---|---|---|
committer | Patrick Williams <patrick@stwcx.xyz> | 2017-08-13 11:32:30 +0000 |
commit | 5978dd11cba74452d6550399191195c9617c2984 (patch) | |
tree | 31afca0f99c2f8e21d6de8747f671922be567939 | |
parent | 255d514ef2a61125670ed6a5cdf942a287315749 (diff) | |
download | phosphor-networkd-5978dd11cba74452d6550399191195c9617c2984.tar.gz phosphor-networkd-5978dd11cba74452d6550399191195c9617c2984.zip |
Create the VLAN Interface Object
Change-Id: I118fc4bbcad2a478a8aad976e0619537780c1227
Signed-off-by: Ratan Gupta <ratagupt@in.ibm.com>
-rw-r--r-- | ethernet_interface.cpp | 39 | ||||
-rw-r--r-- | ethernet_interface.hpp | 23 | ||||
-rw-r--r-- | network_manager.cpp | 6 | ||||
-rw-r--r-- | network_manager.hpp | 2 | ||||
-rw-r--r-- | test/test_ethernet_interface.cpp | 1 | ||||
-rw-r--r-- | vlan_interface.hpp | 2 |
6 files changed, 68 insertions, 5 deletions
diff --git a/ethernet_interface.cpp b/ethernet_interface.cpp index d7648a2..ef7b9df 100644 --- a/ethernet_interface.cpp +++ b/ethernet_interface.cpp @@ -1,6 +1,7 @@ #include "config.h" #include "ipaddress.hpp" #include "ethernet_interface.hpp" +#include "vlan_interface.hpp" #include "network_manager.hpp" #include "routing_table.hpp" @@ -36,15 +37,17 @@ EthernetInterface::EthernetInterface(sdbusplus::bus::bus& bus, Manager& parent, bool emitSignal) : Ifaces(bus, objPath.c_str(), true), + confDir(NETWORK_CONF_DIR), bus(bus), manager(parent), objPath(objPath) { auto intfName = objPath.substr(objPath.rfind("/") + 1); + std::replace(intfName.begin(), intfName.end(), '_', '.'); interfaceName(intfName); dHCPEnabled(dhcpEnabled); mACAddress(getMACAddress()); - createIPAddressObjects(); + // Emit deferred signal. if (emitSignal) { @@ -58,9 +61,11 @@ void EthernetInterface::createIPAddressObjects() addrs.clear(); auto addrs = getInterfaceAddrs()[interfaceName()]; + IP::Protocol addressType = IP::Protocol::IPv4; IP::AddressOrigin origin = IP::AddressOrigin::Static; route::Table routingTable; + for (auto& addr : addrs) { if (addr.addrType == AF_INET6) @@ -284,8 +289,13 @@ std::string EthernetInterface::generateObjectPath(IP::Protocol addressType, bool EthernetInterface::dHCPEnabled(bool value) { + if (value == EthernetInterfaceIntf::dHCPEnabled()) + { + return value; + } + EthernetInterfaceIntf::dHCPEnabled(value); - if (value == true) + if (value) { manager.writeToConfigurationFile(); createIPAddressObjects(); @@ -293,5 +303,30 @@ bool EthernetInterface::dHCPEnabled(bool value) return value; } +void EthernetInterface::createVLAN(VlanId id) +{ + std::string vlanInterfaceName = interfaceName() + "." + + std::to_string(id); + std::string path = objPath; + path += "_" + std::to_string(id); + + + auto vlanIntf = std::make_unique<phosphor::network::VlanInterface>( + bus, + path.c_str(), + EthernetInterfaceIntf::dHCPEnabled(), + id, + *this, + manager); + + // write the device file for the vlan interface. + vlanIntf->writeDeviceFile(); + + this->vlanInterfaces.emplace(std::move(vlanInterfaceName), + std::move(vlanIntf)); + // write the new vlan device entry to the configuration(network) file. + manager.writeToConfigurationFile(); + +} }//namespace network }//namespace phosphor diff --git a/ethernet_interface.hpp b/ethernet_interface.hpp index 88cbf1e..0ab849c 100644 --- a/ethernet_interface.hpp +++ b/ethernet_interface.hpp @@ -1,6 +1,5 @@ #pragma once -#include "ipaddress.hpp" #include "types.hpp" #include "util.hpp" @@ -12,6 +11,7 @@ #include <sdbusplus/server/object.hpp> #include <string> +#include <experimental/filesystem> namespace phosphor { @@ -29,15 +29,24 @@ using IP = sdbusplus::xyz::openbmc_project::Network::server::IP; using EthernetInterfaceIntf = sdbusplus::xyz::openbmc_project::Network::server::EthernetInterface; +namespace fs = std::experimental::filesystem; + class Manager; // forward declaration of network manager. class TestEthernetInterface; +class VlanInterface; + +class IPAddress; + using LinkSpeed = uint16_t; using DuplexMode = uint8_t; using Autoneg = uint8_t; +using VlanId = uint32_t; +using InterfaceName = std::string; using InterfaceInfo = std::tuple<LinkSpeed, DuplexMode, Autoneg>; using AddressMap = std::map<std::string, std::shared_ptr<IPAddress>>; +using VlanInterfaceMap = std::map<InterfaceName, std::unique_ptr<VlanInterface>>; /** @class EthernetInterface * @brief OpenBMC Ethernet Interface implementation. @@ -99,7 +108,16 @@ class EthernetInterface : public Ifaces /** Set value of DHCPEnabled */ bool dHCPEnabled(bool value) override; + /** @brief create Vlan interface. + * @param[in] id- VLAN identifier. + */ + void createVLAN(VlanId id); + using EthernetInterfaceIntf::dHCPEnabled; + using EthernetInterfaceIntf::interfaceName; + + /** @brief Network Configuration directory. */ + fs::path confDir; protected: @@ -150,6 +168,9 @@ class EthernetInterface : public Ifaces /** @brief Persistent map of IPAddress dbus objects and their names */ AddressMap addrs; + /** @brief Persistent map of VLAN interface dbus objects and their names */ + VlanInterfaceMap vlanInterfaces; + /** @brief Dbus object path */ std::string objPath; diff --git a/network_manager.cpp b/network_manager.cpp index cdbaf45..24f3568 100644 --- a/network_manager.cpp +++ b/network_manager.cpp @@ -3,6 +3,7 @@ #include "util.hpp" #include "network_manager.hpp" #include "network_config.hpp" +#include "ipaddress.hpp" #include "xyz/openbmc_project/Common/error.hpp" #include <phosphor-logging/log.hpp> @@ -98,6 +99,9 @@ void Manager::createChildObjects() void Manager::vLAN(IntfName interfaceName, uint32_t id) { + auto& intf = interfaces[interfaceName]; + intf->createVLAN(id); + writeToConfigurationFile(); } void Manager::reset() @@ -207,6 +211,7 @@ void Manager::writeToConfigurationFile() } } + stream << "Gateway=" << systemConf->defaultGateway() << "\n"; // write the route section stream << "[" << "Route" << "]\n"; @@ -225,7 +230,6 @@ void Manager::writeToConfigurationFile() destination != "0.0.0.0" && destination != "") { - stream << "Gateway=" << addr.second->gateway() << "\n"; stream << "Destination=" << destination << "\n"; } diff --git a/network_manager.hpp b/network_manager.hpp index db4db0f..df98104 100644 --- a/network_manager.hpp +++ b/network_manager.hpp @@ -3,6 +3,8 @@ #include "ethernet_interface.hpp" #include "system_configuration.hpp" #include "dhcp_configuration.hpp" +#include "vlan_interface.hpp" + #include <xyz/openbmc_project/Network/VLAN/Create/server.hpp> #include <xyz/openbmc_project/Common/FactoryReset/server.hpp> #include <sdbusplus/bus.hpp> diff --git a/test/test_ethernet_interface.cpp b/test/test_ethernet_interface.cpp index 67a25df..8d1913e 100644 --- a/test/test_ethernet_interface.cpp +++ b/test/test_ethernet_interface.cpp @@ -1,5 +1,6 @@ #include "network_manager.hpp" #include "mock_syscall.hpp" +#include "ipaddress.hpp" #include <gtest/gtest.h> #include <sdbusplus/bus.hpp> diff --git a/vlan_interface.hpp b/vlan_interface.hpp index 7f8d043..c308611 100644 --- a/vlan_interface.hpp +++ b/vlan_interface.hpp @@ -2,6 +2,7 @@ #include "types.hpp" +#include "ethernet_interface.hpp" #include "xyz/openbmc_project/Object/Delete/server.hpp" #include "xyz/openbmc_project/Network/VLAN/server.hpp" @@ -9,7 +10,6 @@ #include <sdbusplus/server/object.hpp> #include <string> -#include "ethernet_interface.hpp" namespace phosphor { |