11#include <umock/ifaddrs.hpp>
12#include <umock/net_if.hpp>
18CNetadapter_platform::CNetadapter_platform(){
19 TRACE2(
this,
" Construct CNetadapter_platform()")
22CNetadapter_platform::~CNetadapter_platform() {
23 TRACE2(
this,
" Destruct CNetadapter_platform()")
28 TRACE2(
this,
" Executing CNetadapter_platform::get_first()")
32 if (getifaddrs(&m_ifa_first) != 0) {
33 throw std::runtime_error(
34 UPnPsdk_LOGEXCEPT(
"MSG1119")
"Failed to get information from "
35 "the network adapters: " +
36 std::string(std::strerror(errno)) +
'\n');
38 UPnPsdk_LOGINFO(
"MSG1132")
"syscall ::getifaddrs() gets " << m_ifa_first
44 TRACE2(
this,
" Executing CNetadapter_platform::get_next()")
45 if (m_ifa_current ==
nullptr)
48 m_ifa_current = m_ifa_current->ifa_next;
50 for (; m_ifa_current !=
nullptr; m_ifa_current = m_ifa_current->ifa_next) {
51 if (is_valid_if(m_ifa_current))
58 TRACE2(
this,
" Executing CNetadapter_platform::index()")
59 return (m_ifa_current ==
nullptr)
61 : umock::net_if_h.if_nametoindex(m_ifa_current->ifa_name);
65 TRACE2(
this,
" Executing CNetadapter_platform::name()")
66 return (m_ifa_current ==
nullptr) ?
"" : m_ifa_current->ifa_name;
72sa_family_t CNetadapter_platform::in_family() {
73 TRACE2(
this,
" Executing CNetadapter_platform::in_family()")
74 if (m_ifa_current ==
nullptr)
76 return m_ifa_current->ifa_addr->sa_family;
81 TRACE2(
this,
" Executing CNetadapter_platform::sockaddr()")
82 if (m_ifa_current ==
nullptr) {
87 a_saddr =
reinterpret_cast<sockaddr_storage&
>(*m_ifa_current->ifa_addr);
92 TRACE2(
this,
" Executing CNetadapter_platform::socknetmask()")
93 if (m_ifa_current !=
nullptr) {
96 reinterpret_cast<sockaddr_storage&
>(*m_ifa_current->ifa_netmask);
102 TRACE2(
this,
" Executing CNetadapter_platform::bitmask()")
103 if (m_ifa_current ==
nullptr)
107 m_ifa_current->ifa_netmask));
114void CNetadapter_platform::free_ifaddrs() noexcept {
115 TRACE2(
this,
" Executing CNetadapter::free_ifaddrs()")
116 if (m_ifa_first !=
nullptr) {
117 UPnPsdk_LOGINFO(
"MSG1116")
"syscall ::freeifaddrs(" << m_ifa_first
119 freeifaddrs(m_ifa_first);
120 m_ifa_first =
nullptr;
122 m_ifa_current =
nullptr;
126CNetadapter_platform::is_valid_if(
const ifaddrs* a_ifa)
const noexcept {
129 if (a_ifa ==
nullptr || a_ifa->ifa_addr ==
nullptr)
132 if (a_ifa->ifa_flags & IFF_LOOPBACK &&
133 (a_ifa->ifa_addr->sa_family == AF_INET6 ||
134 a_ifa->ifa_addr->sa_family == AF_INET))
137 if ((a_ifa->ifa_addr->sa_family == AF_INET6 ||
138 a_ifa->ifa_addr->sa_family == AF_INET) &&
139 a_ifa->ifa_flags & IFF_UP && a_ifa->ifa_flags & IFF_MULTICAST)
146 TRACE2(
this,
" Executing CNetadapter_platform::reset()")
147 m_ifa_current =
nullptr;
150 for (ifaddrs* ifa_current = m_ifa_first; ifa_current !=
nullptr;
151 ifa_current = ifa_current->ifa_next) {
152 if (is_valid_if(ifa_current)) {
153 m_ifa_current = ifa_current;
uint8_t netmask_to_bitmask(const ::sockaddr_storage *a_netmask)
Get prefix bit number from a network address mask.
Reengineered Object Oriented UPnP+ program code.
Manage information about network adapters.
Trivial ::sockaddr structures enhanced with methods.
Define macro for synced logging to the console for detailed info and debug.