blob: 32c9462e0654724504816aaa431293a5b11d4a47 [file] [log] [blame]
Ratan Gupta2eff84f2017-04-20 19:19:15 +05301#include "ipaddress.hpp"
Patrick Venture189d44e2018-07-09 12:30:59 -07002
Ratan Gupta2eff84f2017-04-20 19:19:15 +05303#include "ethernet_interface.hpp"
William A. Kennington III59e5b912022-11-02 02:49:46 -07004#include "network_manager.hpp"
Nagaraju Goruganti66b974d2017-10-03 08:43:08 -05005#include "util.hpp"
Ratan Gupta2eff84f2017-04-20 19:19:15 +05306
Nagaraju Goruganti66b974d2017-10-03 08:43:08 -05007#include <phosphor-logging/elog-errors.hpp>
Jagpal Singh Gilla2947b42023-04-17 21:10:14 -07008#include <phosphor-logging/lg2.hpp>
Patrick Williams89d734b2023-05-10 07:50:25 -05009#include <xyz/openbmc_project/Common/error.hpp>
10
William A. Kennington IIIc2e5e0e2019-04-22 01:26:06 -070011#include <stdexcept>
William A. Kennington IIIc2e5e0e2019-04-22 01:26:06 -070012#include <string>
13#include <string_view>
William A. Kennington IIIc2e5e0e2019-04-22 01:26:06 -070014
Ratan Gupta2eff84f2017-04-20 19:19:15 +053015namespace phosphor
16{
17namespace network
18{
19
20using namespace phosphor::logging;
Nagaraju Goruganti66b974d2017-10-03 08:43:08 -050021using namespace sdbusplus::xyz::openbmc_project::Common::Error;
William A. Kennington III5e72d082022-09-01 13:10:17 -070022using NotAllowed = sdbusplus::xyz::openbmc_project::Common::Error::NotAllowed;
23using Reason = xyz::openbmc_project::Common::NotAllowed::REASON;
Ratan Gupta2eff84f2017-04-20 19:19:15 +053024
William A. Kennington III59e5b912022-11-02 02:49:46 -070025static auto makeObjPath(std::string_view root, IfAddr addr)
Ratan Gupta2eff84f2017-04-20 19:19:15 +053026{
William A. Kennington III59e5b912022-11-02 02:49:46 -070027 auto ret = sdbusplus::message::object_path(std::string(root));
28 ret /= std::to_string(addr);
29 return ret;
30}
Ravi Teja2fd2f7d2019-06-06 03:27:55 -050031
William A. Kennington III59e5b912022-11-02 02:49:46 -070032template <typename T>
33struct Proto
Patrick Williams89d734b2023-05-10 07:50:25 -050034{};
William A. Kennington III59e5b912022-11-02 02:49:46 -070035
36template <>
37struct Proto<in_addr>
38{
39 static inline constexpr auto value = IP::Protocol::IPv4;
40};
41
42template <>
43struct Proto<in6_addr>
44{
45 static inline constexpr auto value = IP::Protocol::IPv6;
46};
47
48IPAddress::IPAddress(sdbusplus::bus_t& bus, std::string_view objRoot,
William A. Kennington III9ede1b72022-11-21 01:59:28 -080049 stdplus::PinnedRef<EthernetInterface> parent, IfAddr addr,
William A. Kennington III59e5b912022-11-02 02:49:46 -070050 AddressOrigin origin) :
51 IPAddress(bus, makeObjPath(objRoot, addr), parent, addr, origin)
Patrick Williams89d734b2023-05-10 07:50:25 -050052{}
William A. Kennington III59e5b912022-11-02 02:49:46 -070053
54IPAddress::IPAddress(sdbusplus::bus_t& bus,
55 sdbusplus::message::object_path objPath,
William A. Kennington III9ede1b72022-11-21 01:59:28 -080056 stdplus::PinnedRef<EthernetInterface> parent, IfAddr addr,
William A. Kennington III59e5b912022-11-02 02:49:46 -070057 AddressOrigin origin) :
58 IPIfaces(bus, objPath.str.c_str(), IPIfaces::action::defer_emit),
59 parent(parent), objPath(std::move(objPath))
60{
William A. Kennington IIId99e6db2022-11-15 20:39:45 -080061 IP::address(std::to_string(addr.getAddr()), true);
62 IP::prefixLength(addr.getPfx(), true);
William A. Kennington III59e5b912022-11-02 02:49:46 -070063 IP::type(std::visit([](auto v) { return Proto<decltype(v)>::value; },
William A. Kennington IIId99e6db2022-11-15 20:39:45 -080064 addr.getAddr()),
65 true);
66 IP::origin(origin, true);
Gunnar Mills57d9c502018-09-14 14:42:34 -050067 emit_object_added();
Ratan Gupta2eff84f2017-04-20 19:19:15 +053068}
William A. Kennington III5e72d082022-09-01 13:10:17 -070069std::string IPAddress::address(std::string /*ipAddress*/)
70{
71 elog<NotAllowed>(Reason("Property update is not allowed"));
72}
73uint8_t IPAddress::prefixLength(uint8_t /*value*/)
74{
75 elog<NotAllowed>(Reason("Property update is not allowed"));
76}
77std::string IPAddress::gateway(std::string /*gateway*/)
78{
79 elog<NotAllowed>(Reason("Property update is not allowed"));
80}
81IP::Protocol IPAddress::type(IP::Protocol /*type*/)
82{
83 elog<NotAllowed>(Reason("Property update is not allowed"));
84}
85IP::AddressOrigin IPAddress::origin(IP::AddressOrigin /*origin*/)
86{
87 elog<NotAllowed>(Reason("Property update is not allowed"));
88}
Ratan Gupta2eff84f2017-04-20 19:19:15 +053089void IPAddress::delete_()
90{
William A. Kennington III2dae9692019-04-22 02:18:41 -070091 if (origin() != IP::AddressOrigin::Static)
Nagaraju Goruganti66b974d2017-10-03 08:43:08 -050092 {
William A. Kennington III1d25ca42023-05-30 16:55:28 -070093 lg2::error("Tried to delete a non-static address {NET_IP} prefix "
94 "{NET_PFX} interface {NET_INTF}",
95 "NET_IP", address(), "NET_PFX", prefixLength(), "NET_INTF",
96 parent.get().interfaceName());
William A. Kennington III2dae9692019-04-22 02:18:41 -070097 elog<InternalFailure>();
Nagaraju Goruganti66b974d2017-10-03 08:43:08 -050098 }
99
William A. Kennington III59e5b912022-11-02 02:49:46 -0700100 std::unique_ptr<IPAddress> ptr;
William A. Kennington III9ede1b72022-11-21 01:59:28 -0800101 auto& addrs = parent.get().addrs;
102 for (auto it = addrs.begin(); it != addrs.end(); ++it)
William A. Kennington III59e5b912022-11-02 02:49:46 -0700103 {
104 if (it->second.get() == this)
105 {
106 ptr = std::move(it->second);
William A. Kennington III9ede1b72022-11-21 01:59:28 -0800107 addrs.erase(it);
William A. Kennington III59e5b912022-11-02 02:49:46 -0700108 break;
109 }
110 }
111
William A. Kennington III9ede1b72022-11-21 01:59:28 -0800112 parent.get().writeConfigurationFile();
113 parent.get().manager.get().reloadConfigs();
Ratan Gupta2eff84f2017-04-20 19:19:15 +0530114}
115
Gunnar Mills57d9c502018-09-14 14:42:34 -0500116} // namespace network
117} // namespace phosphor