1 #pragma once
2 #include "types.hpp"
3 
4 #include <net/ethernet.h>
5 
6 #include <cstdint>
7 #include <optional>
8 #include <stdplus/zstring.hpp>
9 #include <stdplus/zstring_view.hpp>
10 #include <string>
11 #include <string_view>
12 #include <vector>
13 
14 struct nlmsghdr;
15 
16 namespace phosphor::network::system
17 {
18 struct EthInfo
19 {
20     bool autoneg;
21     uint16_t speed;
22 };
23 EthInfo getEthInfo(stdplus::zstring_view ifname);
24 
25 bool intfIsRunning(std::string_view ifname);
26 
27 std::optional<unsigned> getMTU(stdplus::zstring_view ifname);
28 
29 void setMTU(std::string_view ifname, unsigned mtu);
30 
31 void setNICUp(std::string_view ifname, bool up);
32 
33 /** @class InterfaceInfo
34  *  @brief Information about interfaces from the kernel
35  */
36 struct InterfaceInfo
37 {
38     unsigned idx;
39     unsigned flags;
40     std::optional<std::string> name = std::nullopt;
41     std::optional<ether_addr> mac = std::nullopt;
42     std::optional<unsigned> mtu = std::nullopt;
43 
44     constexpr bool operator==(const InterfaceInfo& rhs) const noexcept
45     {
46         return idx == rhs.idx && flags == rhs.flags && name == rhs.name &&
47                mac == rhs.mac && mtu == rhs.mtu;
48     }
49 };
50 
51 namespace detail
52 {
53 InterfaceInfo parseInterface(const nlmsghdr& hdr, std::string_view msg);
54 bool validateNewInterface(const InterfaceInfo& info);
55 } // namespace detail
56 
57 /** @brief Get all the interfaces from the system.
58  *  @returns list of interface names.
59  */
60 std::vector<InterfaceInfo> getInterfaces();
61 
62 } // namespace phosphor::network::system
63