11#include <umock/iphlpapi.hpp>
17CNetadapter_platform::CNetadapter_platform(){
18 TRACE2(
this,
" Construct CNetadapter_platform()")
21CNetadapter_platform::~CNetadapter_platform() {
22 TRACE2(
this,
" Destruct CNetadapter_platform()")
23 this->free_adaptaddrs();
29 TRACE2(
this,
" Executing CNetadapter_platform::get_first()")
34 ULONG ret = umock::iphlpapi_h.GetAdaptersAddresses(
35 AF_UNSPEC, GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_DNS_SERVER,
nullptr,
36 m_adapt_first, &adapts_size);
37 if (ret != ERROR_BUFFER_OVERFLOW) {
38 throw std::runtime_error(
39 UPnPsdk_LOGEXCEPT(
"MSG1120")
"failed to get buffer size for list "
40 "of adapters (errid=" +
41 std::to_string(ret) +
").");
44 this->free_adaptaddrs();
47 m_adapt_first =
static_cast<PIP_ADAPTER_ADDRESSES
>(malloc(adapts_size));
48 if (m_adapt_first ==
nullptr) {
49 throw std::runtime_error(UPnPsdk_LOGEXCEPT(
50 "MSG1121")
"failed to allocate memory for list of adapters.");
53 ret = umock::iphlpapi_h.GetAdaptersAddresses(
54 AF_UNSPEC, GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_DNS_SERVER,
nullptr,
55 m_adapt_first, &adapts_size);
56 if (ret != ERROR_SUCCESS) {
57 throw std::runtime_error(
59 "MSG1122")
"failed to find list of adapters (errid=" +
60 std::to_string(ret) +
").");
63 m_adapt_current = m_adapt_first;
64 m_unicastaddr_current = m_adapt_current->FirstUnicastAddress;
73 TRACE2(
this,
" Executing CNetadapter_platform::get_next()")
74 if (m_adapt_current ==
nullptr) {
75 m_unicastaddr_current =
nullptr;
78 if (m_adapt_current !=
nullptr && m_unicastaddr_current ==
nullptr) {
79 m_adapt_current = m_adapt_current->Next;
80 if (m_adapt_current ==
nullptr) {
83 m_unicastaddr_current = m_adapt_current->FirstUnicastAddress;
87 if (m_adapt_current !=
nullptr && m_unicastaddr_current !=
nullptr) {
88 m_unicastaddr_current = m_unicastaddr_current->Next;
89 if (m_unicastaddr_current ==
nullptr) {
90 m_adapt_current = m_adapt_current->Next;
91 if (m_adapt_current ==
nullptr) {
94 m_unicastaddr_current = m_adapt_current->FirstUnicastAddress;
101 throw std::invalid_argument(
103 "MSG1123")
"Failed to get next network adapter entry. This should "
105 "come up and must be fixed. m_adapt_current=" +
106 std::to_string(
reinterpret_cast<uintptr_t
>(m_adapt_current)) +
107 ", m_unicastaddr_current=" +
108 std::to_string(
reinterpret_cast<uintptr_t
>(m_unicastaddr_current)) +
113 TRACE2(
this,
" Executing CNetadapter_platform::name()")
114 if (m_adapt_current ==
nullptr)
129 wcstombs_s(&i, if_name,
sizeof(if_name), m_adapt_current->FriendlyName,
130 sizeof(if_name) - 1);
136 TRACE2(
this,
" Executing CNetadapter_platform::sockaddr()")
137 if (m_adapt_current ==
nullptr) {
143 reinterpret_cast<sockaddr_storage*
>(
144 m_unicastaddr_current->Address.lpSockaddr),
150 TRACE2(
this,
" Executing CNetadapter_platform::socknetmask()")
151 if (m_adapt_current !=
nullptr) {
153 m_unicastaddr_current->Address.lpSockaddr),
154 m_unicastaddr_current->OnLinkPrefixLength,
160 TRACE2(
this,
" Executing CNetadapter_platform::bitmask()")
161 if (m_adapt_current ==
nullptr)
164 return m_unicastaddr_current->OnLinkPrefixLength;
167unsigned int CNetadapter_platform::
index()
const {
168 TRACE2(
this,
" Executing CNetadapter_platform::index()")
169 if (m_adapt_current ==
nullptr)
173 if (m_adapt_current->IfIndex != 0)
174 return m_adapt_current->IfIndex;
175 if (m_adapt_current->Ipv6IfIndex != 0)
176 return m_adapt_current->Ipv6IfIndex;
184void CNetadapter_platform::free_adaptaddrs() noexcept {
185 TRACE2(
this,
" Executing CNetadapter_platform::free_adaptaddrs()")
186 if (m_adapt_first !=
nullptr) {
188 m_adapt_first =
nullptr;
190 m_adapt_current =
nullptr;
191 m_unicastaddr_current =
nullptr;
195 TRACE2(
this,
" Executing CNetadapter_platform::reset()")
196 m_adapt_current = m_adapt_first;
197 m_unicastaddr_current = m_adapt_current ==
nullptr
199 : m_adapt_current->FirstUnicastAddress;
void bitmask_to_netmask(const ::sockaddr_storage *a_saddr, const unsigned int a_prefixlength, SSockaddr &a_saddrObj)
Get network address mask from address prefix bit number.
Reengineered Object Oriented UPnP+ program code.
Manage information about network adapters.
Define macro for synced logging to the console for detailed info and debug.