1 #pragma once
2 #include "ipaddress.hpp"
3 #include "neighbor.hpp"
4 #include "types.hpp"
5 #include "xyz/openbmc_project/Network/IP/Create/server.hpp"
6 #include "xyz/openbmc_project/Network/Neighbor/CreateStatic/server.hpp"
7 
8 #include <optional>
9 #include <sdbusplus/bus.hpp>
10 #include <sdbusplus/server/object.hpp>
11 #include <stdplus/zstring_view.hpp>
12 #include <string>
13 #include <vector>
14 #include <xyz/openbmc_project/Collection/DeleteAll/server.hpp>
15 #include <xyz/openbmc_project/Network/EthernetInterface/server.hpp>
16 #include <xyz/openbmc_project/Network/MACAddress/server.hpp>
17 #include <xyz/openbmc_project/Network/VLAN/server.hpp>
18 #include <xyz/openbmc_project/Object/Delete/server.hpp>
19 
20 namespace phosphor
21 {
22 namespace network
23 {
24 
25 using Ifaces = sdbusplus::server::object_t<
26     sdbusplus::xyz::openbmc_project::Network::server::EthernetInterface,
27     sdbusplus::xyz::openbmc_project::Network::server::MACAddress,
28     sdbusplus::xyz::openbmc_project::Network::IP::server::Create,
29     sdbusplus::xyz::openbmc_project::Network::Neighbor::server::CreateStatic,
30     sdbusplus::xyz::openbmc_project::Collection::server::DeleteAll>;
31 
32 using VlanIfaces = sdbusplus::server::object_t<
33     sdbusplus::xyz::openbmc_project::Object::server::Delete,
34     sdbusplus::xyz::openbmc_project::Network::server::VLAN>;
35 
36 using VlanIntf = sdbusplus::xyz::openbmc_project::Network::server::VLAN;
37 
38 using IP = sdbusplus::xyz::openbmc_project::Network::server::IP;
39 
40 using EthernetInterfaceIntf =
41     sdbusplus::xyz::openbmc_project::Network::server::EthernetInterface;
42 using MacAddressIntf =
43     sdbusplus::xyz::openbmc_project::Network::server::MACAddress;
44 
45 using ServerList = std::vector<std::string>;
46 using ObjectPath = sdbusplus::message::object_path;
47 
48 class Manager;
49 
50 class TestEthernetInterface;
51 class TestNetworkManager;
52 
53 namespace config
54 {
55 class Parser;
56 }
57 
58 /** @class EthernetInterface
59  *  @brief OpenBMC Ethernet Interface implementation.
60  *  @details A concrete implementation for the
61  *  xyz.openbmc_project.Network.EthernetInterface DBus API.
62  */
63 class EthernetInterface : public Ifaces
64 {
65   public:
66     EthernetInterface() = delete;
67     EthernetInterface(const EthernetInterface&) = delete;
68     EthernetInterface& operator=(const EthernetInterface&) = delete;
69     EthernetInterface(EthernetInterface&&) = delete;
70     EthernetInterface& operator=(EthernetInterface&&) = delete;
71     virtual ~EthernetInterface() = default;
72 
73     /** @brief Constructor to put object onto bus at a dbus path.
74      *  @param[in] bus - Bus to attach to.
75      *  @param[in] manager - parent object.
76      *  @param[in] info - Interface information.
77      *  @param[in] objRoot - Path to attach at.
78      *  @param[in] config - The parsed configuation file.
79      *  @param[in] vlan - The id of the vlan if configured
80      *  @param[in] emitSignal - true if the object added signal needs to be
81      *                          send.
82      *  @param[in] enabled - Determine if systemd-networkd is managing this link
83      */
84     EthernetInterface(sdbusplus::bus_t& bus, Manager& manager,
85                       const InterfaceInfo& info, std::string_view objRoot,
86                       const config::Parser& config, bool emitSignal,
87                       bool enabled);
88 
89     /** @brief Network Manager object. */
90     Manager& manager;
91 
92     /** @brief Persistent map of IPAddress dbus objects and their names */
93     std::unordered_map<IfAddr, std::unique_ptr<IPAddress>> addrs;
94 
95     /** @brief Persistent map of Neighbor dbus objects and their names */
96     std::unordered_map<InAddrAny, std::unique_ptr<Neighbor>> staticNeighbors;
97 
98     void addAddr(const AddressInfo& info);
99     void addStaticNeigh(const NeighborInfo& info);
100 
101     /** @brief Updates the interface information based on new InterfaceInfo */
102     void updateInfo(const InterfaceInfo& info);
103 
104     /** @brief Function used to load the ntpservers
105      */
106     void loadNTPServers(const config::Parser& config);
107 
108     /** @brief Function used to load the nameservers.
109      */
110     void loadNameServers(const config::Parser& config);
111 
112     /** @brief Function to create ipAddress dbus object.
113      *  @param[in] addressType - Type of ip address.
114      *  @param[in] ipAddress- IP address.
115      *  @param[in] prefixLength - Length of prefix.
116      */
117 
118     ObjectPath ip(IP::Protocol addressType, std::string ipAddress,
119                   uint8_t prefixLength, std::string) override;
120 
121     /** @brief Function to create static neighbor dbus object.
122      *  @param[in] ipAddress - IP address.
123      *  @param[in] macAddress - Low level MAC address.
124      */
125     ObjectPath neighbor(std::string ipAddress, std::string macAddress) override;
126 
127     /** Set value of DHCPEnabled */
128     DHCPConf dhcpEnabled() const override;
129     DHCPConf dhcpEnabled(DHCPConf value) override;
130     using EthernetInterfaceIntf::dhcp4;
131     bool dhcp4(bool value) override;
132     using EthernetInterfaceIntf::dhcp6;
133     bool dhcp6(bool value) override;
134 
135     inline bool dhcpIsEnabled(in_addr) const
136     {
137         return dhcp4();
138     }
139     inline bool dhcpIsEnabled(in6_addr) const
140     {
141         return dhcp6();
142     }
143     inline bool dhcpIsEnabled(InAddrAny addr) const
144     {
145         return std::visit([&](auto v) { return dhcpIsEnabled(v); }, addr);
146     }
147 
148     /** Set size of MTU */
149     size_t mtu(size_t value) override;
150 
151     /** Set value of NICEnabled */
152     bool nicEnabled(bool value) override;
153 
154     /** @brief sets the MAC address.
155      *  @param[in] value - MAC address which needs to be set on the system.
156      *  @returns macAddress of the interface or throws an error.
157      */
158     std::string macAddress(std::string value) override;
159 
160     /** @brief check conf file for Router Advertisements
161      *
162      */
163     bool ipv6AcceptRA(bool value) override;
164     using EthernetInterfaceIntf::ipv6AcceptRA;
165 
166     /** @brief sets the NTP servers.
167      *  @param[in] value - vector of NTP servers.
168      */
169     ServerList ntpServers(ServerList value) override;
170 
171     /** @brief sets the static NTP servers.
172      *  @param[in] value - vector of NTP servers.
173      */
174     ServerList staticNTPServers(ServerList value) override;
175 
176     /** @brief sets the Static DNS/nameservers.
177      *  @param[in] value - vector of DNS servers.
178      */
179 
180     ServerList staticNameServers(ServerList value) override;
181 
182     /** @brief create Vlan interface.
183      *  @param[in] id- VLAN identifier.
184      */
185     ObjectPath createVLAN(uint16_t id);
186 
187     /** @brief write the network conf file with the in-memory objects.
188      */
189     void writeConfigurationFile();
190 
191     /** @brief delete all dbus objects.
192      */
193     void deleteAll();
194 
195     /** @brief set the default v4 gateway of the interface.
196      *  @param[in] gateway - default v4 gateway of the interface.
197      */
198     std::string defaultGateway(std::string gateway) override;
199 
200     /** @brief set the default v6 gateway of the interface.
201      *  @param[in] gateway - default v6 gateway of the interface.
202      */
203     std::string defaultGateway6(std::string gateway) override;
204 
205     using EthernetInterfaceIntf::interfaceName;
206     using EthernetInterfaceIntf::linkUp;
207     using EthernetInterfaceIntf::mtu;
208     using EthernetInterfaceIntf::nicEnabled;
209     using MacAddressIntf::macAddress;
210 
211     using EthernetInterfaceIntf::defaultGateway;
212     using EthernetInterfaceIntf::defaultGateway6;
213 
214   protected:
215     /** @brief get the NTP server list from the timsyncd dbus obj
216      *
217      */
218     virtual ServerList getNTPServerFromTimeSyncd();
219 
220     /** @brief get the name server details from the network conf
221      *
222      */
223     virtual ServerList getNameServerFromResolvd();
224 
225     /** @brief Persistent sdbusplus DBus bus connection. */
226     sdbusplus::bus_t& bus;
227 
228     /** @brief Dbus object path */
229     std::string objPath;
230 
231     /** @brief Interface index */
232     unsigned ifIdx;
233 
234     struct VlanProperties : VlanIfaces
235     {
236         VlanProperties(sdbusplus::bus_t& bus, stdplus::const_zstring objPath,
237                        const InterfaceInfo& info, EthernetInterface& eth,
238                        bool emitSignal = true);
239         void delete_() override;
240         unsigned parentIdx;
241         EthernetInterface& eth;
242     };
243     std::optional<VlanProperties> vlan;
244 
245     friend class TestEthernetInterface;
246     friend class TestNetworkManager;
247 
248   private:
249     EthernetInterface(sdbusplus::bus_t& bus, Manager& manager,
250                       const InterfaceInfo& info, std::string&& objPath,
251                       const config::Parser& config, bool emitSignal,
252                       bool enabled);
253 
254     /** @brief Determines if the address is manually assigned
255      *  @param[in] origin - The origin entry of the IP::Address
256      *  @returns true/false value if the address is static
257      */
258     bool originIsManuallyAssigned(IP::AddressOrigin origin);
259 };
260 
261 } // namespace network
262 } // namespace phosphor
263