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