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 {NET_IP} prefix " 94 "{NET_PFX} interface {NET_INTF}", 95 "NET_IP", address(), "NET_PFX", prefixLength(), "NET_INTF", 96 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