summaryrefslogtreecommitdiff
path: root/meta-openbmc-mods/meta-common/recipes-network/network/phosphor-network/0011-Added-enable-disable-control-of-the-Network-Interfac.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-openbmc-mods/meta-common/recipes-network/network/phosphor-network/0011-Added-enable-disable-control-of-the-Network-Interfac.patch')
-rw-r--r--meta-openbmc-mods/meta-common/recipes-network/network/phosphor-network/0011-Added-enable-disable-control-of-the-Network-Interfac.patch189
1 files changed, 189 insertions, 0 deletions
diff --git a/meta-openbmc-mods/meta-common/recipes-network/network/phosphor-network/0011-Added-enable-disable-control-of-the-Network-Interfac.patch b/meta-openbmc-mods/meta-common/recipes-network/network/phosphor-network/0011-Added-enable-disable-control-of-the-Network-Interfac.patch
new file mode 100644
index 000000000..58dcf3f21
--- /dev/null
+++ b/meta-openbmc-mods/meta-common/recipes-network/network/phosphor-network/0011-Added-enable-disable-control-of-the-Network-Interfac.patch
@@ -0,0 +1,189 @@
+From 4bfb4ad5ff795d78e06fbeaf1664df6819880f50 Mon Sep 17 00:00:00 2001
+From: Johnathan Mantey <johnathanx.mantey@intel.com>
+Date: Tue, 29 Oct 2019 16:20:28 -0700
+Subject: [PATCH] Added enable/disable control of the Network Interface Card
+
+Implemented enable/disable function to perform
+"ip link set eth(x) up"
+"ip link set eth(x) down"
+functionality from DBus.
+
+Tested:
+
+Confirmed Redfish PATCH commands on the InterfaceEnabled property
+changes the NIC state. Confirmed the NIC is DOWN/UP using "ip link".
+Confirmed "ip link" state changes can be obsserved from dbus-send
+commands, and from Redfish GET actions.
+
+Confirmed the link is inactive after a reboot.
+
+Confirmed link stays down despite assigning an IP manually.
+
+Confirmed link stays down despite enabling DHCP.
+
+Change-Id: I4152b53055e6546f7a6ca81b5a5eef6f689bcc66
+Signed-off-by: Johnathan Mantey <johnathanx.mantey@intel.com>
+---
+ ethernet_interface.cpp | 73 ++++++++++++++++++++++++++++++++++++++++--
+ ethernet_interface.hpp | 11 ++++++-
+ 2 files changed, 81 insertions(+), 3 deletions(-)
+
+diff --git a/ethernet_interface.cpp b/ethernet_interface.cpp
+index 8b8f698..a2754a4 100644
+--- a/ethernet_interface.cpp
++++ b/ethernet_interface.cpp
+@@ -85,6 +85,7 @@ EthernetInterface::EthernetInterface(sdbusplus::bus::bus& bus,
+ EthernetInterfaceIntf::autoNeg(std::get<2>(ifInfo));
+ EthernetInterfaceIntf::speed(std::get<0>(ifInfo));
+ EthernetInterfaceIntf::linkUp(std::get<3>(ifInfo));
++ EthernetInterfaceIntf::nICEnabled(std::get<4>(ifInfo));
+ #endif
+ getChannelPrivilege(intfName);
+
+@@ -323,11 +324,12 @@ InterfaceInfo EthernetInterface::getInterfaceInfo() const
+ Autoneg autoneg{0};
+ DuplexMode duplex{0};
+ LinkUp linkState{false};
++ NICEnabled nicEnabled{false};
+ EthernetIntfSocket eifSocket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
+
+ if (eifSocket.sock < 0)
+ {
+- return std::make_tuple(speed, duplex, autoneg, linkState);
++ return std::make_tuple(speed, duplex, autoneg, linkState, nicEnabled);
+ }
+
+ std::strncpy(ifr.ifr_name, interfaceName().c_str(), IFNAMSIZ - 1);
+@@ -341,9 +343,10 @@ InterfaceInfo EthernetInterface::getInterfaceInfo() const
+ autoneg = edata.autoneg;
+ }
+
++ nicEnabled = nICEnabled();
+ linkState = linkUp();
+
+- return std::make_tuple(speed, duplex, autoneg, linkState);
++ return std::make_tuple(speed, duplex, autoneg, linkState, nicEnabled);
+ }
+ #endif
+
+@@ -548,6 +551,67 @@ bool EthernetInterface::linkUp() const
+ log<level::ERR>("ioctl failed for SIOCGIFFLAGS:",
+ entry("ERROR=%s", strerror(errno)));
+ }
++ return value;
++}
++
++bool EthernetInterface::nICEnabled() const
++{
++ EthernetIntfSocket eifSocket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
++ bool value = EthernetInterfaceIntf::nICEnabled();
++
++ if (eifSocket.sock < 0)
++ {
++ return value;
++ }
++
++ ifreq ifr{0};
++ std::strncpy(ifr.ifr_name, interfaceName().c_str(), IF_NAMESIZE - 1);
++ if (ioctl(eifSocket.sock, SIOCGIFFLAGS, &ifr) == 0)
++ {
++ value = static_cast<bool>(ifr.ifr_flags & IFF_UP);
++ }
++ else
++ {
++ log<level::ERR>("ioctl failed for SIOCGIFFLAGS:",
++ entry("ERROR=%s", strerror(errno)));
++ }
++ return value;
++}
++
++bool EthernetInterface::nICEnabled(bool value)
++{
++ if (value == EthernetInterfaceIntf::nICEnabled())
++ {
++ return value;
++ }
++
++ EthernetIntfSocket eifSocket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
++ if (eifSocket.sock < 0)
++ {
++ return EthernetInterfaceIntf::nICEnabled();
++ }
++
++ ifreq ifr{0};
++ std::strncpy(ifr.ifr_name, interfaceName().c_str(), IF_NAMESIZE - 1);
++ if (ioctl(eifSocket.sock, SIOCGIFFLAGS, &ifr) != 0)
++ {
++ log<level::ERR>("ioctl failed for SIOCGIFFLAGS:",
++ entry("ERROR=%s", strerror(errno)));
++ return EthernetInterfaceIntf::nICEnabled();
++ }
++
++ ifr.ifr_flags &= ~IFF_UP;
++ ifr.ifr_flags |= value ? IFF_UP : 0;
++
++ if (ioctl(eifSocket.sock, SIOCSIFFLAGS, &ifr) != 0)
++ {
++ log<level::ERR>("ioctl failed for SIOCSIFFLAGS:",
++ entry("ERROR=%s", strerror(errno)));
++ return EthernetInterfaceIntf::nICEnabled();
++ }
++ EthernetInterfaceIntf::nICEnabled(value);
++ writeConfigurationFile();
++ manager.restartSystemdUnit(networkdService);
+
+ return value;
+ }
+@@ -742,6 +806,11 @@ void EthernetInterface::writeConfigurationFile()
+ stream << "MACAddress=" << mac << "\n";
+ }
+
++ if (!nICEnabled())
++ {
++ stream << "Unmanaged=yes\n";
++ }
++
+ // write the network section
+ stream << "[Network]\n";
+ #ifdef LINK_LOCAL_AUTOCONFIGURATION
+diff --git a/ethernet_interface.hpp b/ethernet_interface.hpp
+index 4e36ae8..104750e 100644
+--- a/ethernet_interface.hpp
++++ b/ethernet_interface.hpp
+@@ -60,9 +60,11 @@ using LinkSpeed = uint16_t;
+ using DuplexMode = uint8_t;
+ using Autoneg = uint8_t;
+ using LinkUp = bool;
++using NICEnabled = bool;
+ using VlanId = uint32_t;
+ using InterfaceName = std::string;
+-using InterfaceInfo = std::tuple<LinkSpeed, DuplexMode, Autoneg, LinkUp>;
++using InterfaceInfo =
++ std::tuple<LinkSpeed, DuplexMode, Autoneg, LinkUp, NICEnabled>;
+ using AddressMap = std::map<std::string, std::shared_ptr<IPAddress>>;
+ using NeighborMap = std::map<std::string, std::shared_ptr<Neighbor>>;
+ using VlanInterfaceMap =
+@@ -190,6 +192,12 @@ class EthernetInterface : public Ifaces
+ /** Retrieve Link State */
+ bool linkUp() const override;
+
++ /** Retrieve NIC State */
++ bool nICEnabled() const override;
++
++ /** Set value of NICEnabled */
++ bool nICEnabled(bool value) override;
++
+ /** @brief sets the MAC address.
+ * @param[in] value - MAC address which needs to be set on the system.
+ * @returns macAddress of the interface or throws an error.
+@@ -246,6 +254,7 @@ class EthernetInterface : public Ifaces
+ using EthernetInterfaceIntf::dHCPEnabled;
+ using EthernetInterfaceIntf::interfaceName;
+ using EthernetInterfaceIntf::linkUp;
++ using EthernetInterfaceIntf::nICEnabled;
+ using MacAddressIntf::mACAddress;
+
+ /** @brief Absolute path of the resolv conf file */
+--
+2.24.1
+