xref: /openbmc/phosphor-networkd/src/ipaddress.cpp (revision 7af5b73d151dbc8504d77c504b3de654d72735fa)
11bbe3d1eSWilliam A. Kennington III #include "ipaddress.hpp"
21bbe3d1eSWilliam A. Kennington III 
31bbe3d1eSWilliam A. Kennington III #include "ethernet_interface.hpp"
459e5b91dSWilliam A. Kennington III #include "network_manager.hpp"
51bbe3d1eSWilliam A. Kennington III #include "util.hpp"
61bbe3d1eSWilliam A. Kennington III 
71bbe3d1eSWilliam A. Kennington III #include <phosphor-logging/elog-errors.hpp>
8a2947b4bSJagpal Singh Gill #include <phosphor-logging/lg2.hpp>
989d734b9SPatrick Williams #include <xyz/openbmc_project/Common/error.hpp>
1089d734b9SPatrick Williams 
11c2e5e0e9SWilliam A. Kennington III #include <stdexcept>
12c2e5e0e9SWilliam A. Kennington III #include <string>
13c2e5e0e9SWilliam A. Kennington III #include <string_view>
14c2e5e0e9SWilliam A. Kennington III 
151bbe3d1eSWilliam A. Kennington III namespace phosphor
161bbe3d1eSWilliam A. Kennington III {
171bbe3d1eSWilliam A. Kennington III namespace network
181bbe3d1eSWilliam A. Kennington III {
191bbe3d1eSWilliam A. Kennington III 
201bbe3d1eSWilliam A. Kennington III using namespace phosphor::logging;
211bbe3d1eSWilliam A. Kennington III using namespace sdbusplus::xyz::openbmc_project::Common::Error;
225e72d085SWilliam A. Kennington III using NotAllowed = sdbusplus::xyz::openbmc_project::Common::Error::NotAllowed;
235e72d085SWilliam A. Kennington III using Reason = xyz::openbmc_project::Common::NotAllowed::REASON;
241bbe3d1eSWilliam A. Kennington III 
makeObjPath(std::string_view root,stdplus::SubnetAny addr)259b2a20d3SWilliam A. Kennington III static auto makeObjPath(std::string_view root, stdplus::SubnetAny addr)
261bbe3d1eSWilliam A. Kennington III {
2759e5b91dSWilliam A. Kennington III     auto ret = sdbusplus::message::object_path(std::string(root));
289b2a20d3SWilliam A. Kennington III     stdplus::ToStrHandle<stdplus::ToStr<stdplus::SubnetAny>> tsh;
299b2a20d3SWilliam A. Kennington III     ret /= tsh(addr);
3059e5b91dSWilliam A. Kennington III     return ret;
3159e5b91dSWilliam A. Kennington III }
321bbe3d1eSWilliam A. Kennington III 
3359e5b91dSWilliam A. Kennington III template <typename T>
3459e5b91dSWilliam A. Kennington III struct Proto
3589d734b9SPatrick Williams {};
3659e5b91dSWilliam A. Kennington III 
3759e5b91dSWilliam A. Kennington III template <>
389b2a20d3SWilliam A. Kennington III struct Proto<stdplus::In4Addr>
3959e5b91dSWilliam A. Kennington III {
4059e5b91dSWilliam A. Kennington III     static inline constexpr auto value = IP::Protocol::IPv4;
4159e5b91dSWilliam A. Kennington III };
4259e5b91dSWilliam A. Kennington III 
4359e5b91dSWilliam A. Kennington III template <>
449b2a20d3SWilliam A. Kennington III struct Proto<stdplus::In6Addr>
4559e5b91dSWilliam A. Kennington III {
4659e5b91dSWilliam A. Kennington III     static inline constexpr auto value = IP::Protocol::IPv6;
4759e5b91dSWilliam A. Kennington III };
4859e5b91dSWilliam A. Kennington III 
IPAddress(sdbusplus::bus_t & bus,std::string_view objRoot,stdplus::PinnedRef<EthernetInterface> parent,stdplus::SubnetAny addr,AddressOrigin origin)4959e5b91dSWilliam A. Kennington III IPAddress::IPAddress(sdbusplus::bus_t& bus, std::string_view objRoot,
509b2a20d3SWilliam A. Kennington III                      stdplus::PinnedRef<EthernetInterface> parent,
519b2a20d3SWilliam A. Kennington III                      stdplus::SubnetAny addr, AddressOrigin origin) :
5259e5b91dSWilliam A. Kennington III     IPAddress(bus, makeObjPath(objRoot, addr), parent, addr, origin)
5389d734b9SPatrick Williams {}
5459e5b91dSWilliam A. Kennington III 
IPAddress(sdbusplus::bus_t & bus,sdbusplus::message::object_path objPath,stdplus::PinnedRef<EthernetInterface> parent,stdplus::SubnetAny addr,AddressOrigin origin)5559e5b91dSWilliam A. Kennington III IPAddress::IPAddress(sdbusplus::bus_t& bus,
5659e5b91dSWilliam A. Kennington III                      sdbusplus::message::object_path objPath,
579b2a20d3SWilliam A. Kennington III                      stdplus::PinnedRef<EthernetInterface> parent,
589b2a20d3SWilliam A. Kennington III                      stdplus::SubnetAny addr, AddressOrigin origin) :
5959e5b91dSWilliam A. Kennington III     IPIfaces(bus, objPath.str.c_str(), IPIfaces::action::defer_emit),
6059e5b91dSWilliam A. Kennington III     parent(parent), objPath(std::move(objPath))
6159e5b91dSWilliam A. Kennington III {
629b2a20d3SWilliam A. Kennington III     IP::address(stdplus::toStr(addr.getAddr()), true);
63d99e6dbaSWilliam A. Kennington III     IP::prefixLength(addr.getPfx(), true);
6459e5b91dSWilliam A. Kennington III     IP::type(std::visit([](auto v) { return Proto<decltype(v)>::value; },
65d99e6dbaSWilliam A. Kennington III                         addr.getAddr()),
66d99e6dbaSWilliam A. Kennington III              true);
67d99e6dbaSWilliam A. Kennington III     IP::origin(origin, true);
681bbe3d1eSWilliam A. Kennington III     emit_object_added();
691bbe3d1eSWilliam A. Kennington III }
address(std::string)705e72d085SWilliam A. Kennington III std::string IPAddress::address(std::string /*ipAddress*/)
715e72d085SWilliam A. Kennington III {
725e72d085SWilliam A. Kennington III     elog<NotAllowed>(Reason("Property update is not allowed"));
735e72d085SWilliam A. Kennington III }
prefixLength(uint8_t)745e72d085SWilliam A. Kennington III uint8_t IPAddress::prefixLength(uint8_t /*value*/)
755e72d085SWilliam A. Kennington III {
765e72d085SWilliam A. Kennington III     elog<NotAllowed>(Reason("Property update is not allowed"));
775e72d085SWilliam A. Kennington III }
gateway(std::string)785e72d085SWilliam A. Kennington III std::string IPAddress::gateway(std::string /*gateway*/)
795e72d085SWilliam A. Kennington III {
805e72d085SWilliam A. Kennington III     elog<NotAllowed>(Reason("Property update is not allowed"));
815e72d085SWilliam A. Kennington III }
type(IP::Protocol)825e72d085SWilliam A. Kennington III IP::Protocol IPAddress::type(IP::Protocol /*type*/)
835e72d085SWilliam A. Kennington III {
845e72d085SWilliam A. Kennington III     elog<NotAllowed>(Reason("Property update is not allowed"));
855e72d085SWilliam A. Kennington III }
origin(IP::AddressOrigin)865e72d085SWilliam A. Kennington III IP::AddressOrigin IPAddress::origin(IP::AddressOrigin /*origin*/)
875e72d085SWilliam A. Kennington III {
885e72d085SWilliam A. Kennington III     elog<NotAllowed>(Reason("Property update is not allowed"));
895e72d085SWilliam A. Kennington III }
delete_()901bbe3d1eSWilliam A. Kennington III void IPAddress::delete_()
911bbe3d1eSWilliam A. Kennington III {
921bbe3d1eSWilliam A. Kennington III     if (origin() != IP::AddressOrigin::Static)
931bbe3d1eSWilliam A. Kennington III     {
941d25ca4eSWilliam A. Kennington III         lg2::error("Tried to delete a non-static address {NET_IP} prefix "
951d25ca4eSWilliam A. Kennington III                    "{NET_PFX} interface {NET_INTF}",
961d25ca4eSWilliam A. Kennington III                    "NET_IP", address(), "NET_PFX", prefixLength(), "NET_INTF",
971d25ca4eSWilliam A. Kennington III                    parent.get().interfaceName());
98*7af5b73dSJishnu CM 
99*7af5b73dSJishnu CM         elog<NotAllowed>(Reason("Not allowed to delete a non-static address"));
1001bbe3d1eSWilliam A. Kennington III     }
1011bbe3d1eSWilliam A. Kennington III 
10259e5b91dSWilliam A. Kennington III     std::unique_ptr<IPAddress> ptr;
1039ede1b74SWilliam A. Kennington III     auto& addrs = parent.get().addrs;
1049ede1b74SWilliam A. Kennington III     for (auto it = addrs.begin(); it != addrs.end(); ++it)
10559e5b91dSWilliam A. Kennington III     {
10659e5b91dSWilliam A. Kennington III         if (it->second.get() == this)
10759e5b91dSWilliam A. Kennington III         {
10859e5b91dSWilliam A. Kennington III             ptr = std::move(it->second);
1099ede1b74SWilliam A. Kennington III             addrs.erase(it);
11059e5b91dSWilliam A. Kennington III             break;
11159e5b91dSWilliam A. Kennington III         }
11259e5b91dSWilliam A. Kennington III     }
11359e5b91dSWilliam A. Kennington III 
1149ede1b74SWilliam A. Kennington III     parent.get().writeConfigurationFile();
1159ede1b74SWilliam A. Kennington III     parent.get().manager.get().reloadConfigs();
1161bbe3d1eSWilliam A. Kennington III }
1171bbe3d1eSWilliam A. Kennington III 
1181bbe3d1eSWilliam A. Kennington III } // namespace network
1191bbe3d1eSWilliam A. Kennington III } // namespace phosphor
120