xref: /openbmc/phosphor-networkd/src/ipaddress.cpp (revision 89d734b9886c40fa530f9fd6e67eb87b6955ec08)
1 #include "ipaddress.hpp"
2 
3 #include "ethernet_interface.hpp"
4 #include "network_manager.hpp"
5 #include "util.hpp"
6 
7 #include <phosphor-logging/elog-errors.hpp>
8 #include <phosphor-logging/lg2.hpp>
9 #include <xyz/openbmc_project/Common/error.hpp>
10 
11 #include <stdexcept>
12 #include <string>
13 #include <string_view>
14 
15 namespace phosphor
16 {
17 namespace network
18 {
19 
20 using namespace phosphor::logging;
21 using namespace sdbusplus::xyz::openbmc_project::Common::Error;
22 using NotAllowed = sdbusplus::xyz::openbmc_project::Common::Error::NotAllowed;
23 using Reason = xyz::openbmc_project::Common::NotAllowed::REASON;
24 
25 static auto makeObjPath(std::string_view root, IfAddr addr)
26 {
27     auto ret = sdbusplus::message::object_path(std::string(root));
28     ret /= std::to_string(addr);
29     return ret;
30 }
31 
32 template <typename T>
33 struct Proto
34 {};
35 
36 template <>
37 struct Proto<in_addr>
38 {
39     static inline constexpr auto value = IP::Protocol::IPv4;
40 };
41 
42 template <>
43 struct Proto<in6_addr>
44 {
45     static inline constexpr auto value = IP::Protocol::IPv6;
46 };
47 
48 IPAddress::IPAddress(sdbusplus::bus_t& bus, std::string_view objRoot,
49                      stdplus::PinnedRef<EthernetInterface> parent, IfAddr addr,
50                      AddressOrigin origin) :
51     IPAddress(bus, makeObjPath(objRoot, addr), parent, addr, origin)
52 {}
53 
54 IPAddress::IPAddress(sdbusplus::bus_t& bus,
55                      sdbusplus::message::object_path objPath,
56                      stdplus::PinnedRef<EthernetInterface> parent, IfAddr addr,
57                      AddressOrigin origin) :
58     IPIfaces(bus, objPath.str.c_str(), IPIfaces::action::defer_emit),
59     parent(parent), objPath(std::move(objPath))
60 {
61     IP::address(std::to_string(addr.getAddr()), true);
62     IP::prefixLength(addr.getPfx(), true);
63     IP::type(std::visit([](auto v) { return Proto<decltype(v)>::value; },
64                         addr.getAddr()),
65              true);
66     IP::origin(origin, true);
67     emit_object_added();
68 }
69 std::string IPAddress::address(std::string /*ipAddress*/)
70 {
71     elog<NotAllowed>(Reason("Property update is not allowed"));
72 }
73 uint8_t IPAddress::prefixLength(uint8_t /*value*/)
74 {
75     elog<NotAllowed>(Reason("Property update is not allowed"));
76 }
77 std::string IPAddress::gateway(std::string /*gateway*/)
78 {
79     elog<NotAllowed>(Reason("Property update is not allowed"));
80 }
81 IP::Protocol IPAddress::type(IP::Protocol /*type*/)
82 {
83     elog<NotAllowed>(Reason("Property update is not allowed"));
84 }
85 IP::AddressOrigin IPAddress::origin(IP::AddressOrigin /*origin*/)
86 {
87     elog<NotAllowed>(Reason("Property update is not allowed"));
88 }
89 void IPAddress::delete_()
90 {
91     if (origin() != IP::AddressOrigin::Static)
92     {
93         lg2::error("Tried to delete a non-static address {IP_ADDRESS} prefix "
94                    "{PREFIX} interface {INTERFACE_NAME}",
95                    "IP_ADDRESS", address(), "PREFIX", prefixLength(),
96                    "INTERFACE_NAME", parent.get().interfaceName());
97         elog<InternalFailure>();
98     }
99 
100     std::unique_ptr<IPAddress> ptr;
101     auto& addrs = parent.get().addrs;
102     for (auto it = addrs.begin(); it != addrs.end(); ++it)
103     {
104         if (it->second.get() == this)
105         {
106             ptr = std::move(it->second);
107             addrs.erase(it);
108             break;
109         }
110     }
111 
112     parent.get().writeConfigurationFile();
113     parent.get().manager.get().reloadConfigs();
114 }
115 
116 } // namespace network
117 } // namespace phosphor
118